前言:
开发中将数据存储在xml后,希望通过程序获得xml的内容,获取的方式有很多种,开发中比较常见的解析方式有三种:DOM解析,SAX解析、PULL解析,它们各自有各自的优缺点和应用的场景。
三种解析方式:
1、DOM:要求解析器把整个xml文档装载到内存,解析成一个Document对象。
优点:元素与元素之间保持结构关系,可以进行增删改查操作。
缺点:xml文档过大时可能出现内存溢出显示。
2、SAX:是一种速度更快,更有效的方法。它逐行扫描文档,边扫描编解析,并以件驱动的方式进行具体解析,每执一行,都将触发对应的事件。
优点:出来速度快,可以处理大文件。
缺点:只读,逐行后将释放资源。
3、PULL:Android内置的xml解析方式,和SAX类似。
解析器是根据不同的解析方式提供的具体实现,但有的解析器操作过于繁琐,由此,为了方便开发,提供了易于操作的解析开发包。
常见的解析开发包:JAXP、JDom(dom4j兄弟)、jsoup、dom4j(较常用)
实践:
XML DOM和HTML DOM类似,它将整个xml文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象可以对DOM进行操作。
1、使用dom4j前提,导入jar包
dom4j使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的跟元素,然后再进行操作。
2、目录结构:
3、web.xml
在xml中使用Schema约束,必须包含制定的命名空间。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>helloDOM4j</servlet-name> <servlet-class>**********</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloDOM4j</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>4、TestDom4j.java
package cn.ytm.xml.dom4j; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; public class TestDom4j { @Test public void testReadWebXML(){ try { //1、获取解析器 SAXReader saxReader=new SAXReader(); //2、获取document文档对象 Document doc=saxReader.read("src/cn/ytm/xml/schema/web.xml"); //3、获取根元素 Element rootElement=doc.getRootElement(); System.out.println(rootElement.getName()); //获取根元素的名称 System.out.println(rootElement.attributeValue("version"));//获取元素中的属性值 //4、获取跟元素下的子元素 List<Element> childElements=rootElement.elements(); //5、遍历子元素 for (Element element : childElements) { //6、判断元素名称为servlet的元素 if ("servlet".equals(element.getName())) { //7、获取servlet-name元素 Element servletName=element.element("servlet-name"); //8、获取servlet-class元素 Element servletClass=element.element("servlet-class"); System.out.println(servletName.getText()); System.out.println(servletClass.getText()); } } } catch (Exception e) { e.printStackTrace(); } } }
结果: