前言:
开发中将数据存储在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();
}
}
}
结果: