1.4.1 XML解析概述
当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用Java基础所学习的IO知识是可以完成的,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML。
1.4.2 解析方式和解析器
开发中比较常见的解析方式有三种,如下:
1.DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
b)缺点:XML文档过大,可能出现内存溢出显现。
2.SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
a)优点:处理速度快,可以处理大文件
b)缺点:只能读,逐行后将释放资源。
3.PULL:Android内置的XML解析方式,类似SAX。(了解)
- 解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包。
[外链图片转存失败(img-8BcvIyHB-1562192873794)(pics/搜狗截图20190520111918.png)]
- 常见的解析开发包
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
dom4j:比较常用的解析开发包,hibernate底层采用。
1.4.3 DOM解析原理及结构模型
XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作
[外链图片转存失败(img-GMBr0oo0-1562192873795)(pics/搜狗截图20190520112036.png)]
DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!
[外链图片转存失败(img-DJ0OpY3l-1562192873795)(pics/搜狗截图20190520112059.png)]
1.4.5 API使用
如果需要使用dom4j,必须导入jar包。
[外链图片转存失败(img-non9q8Xi-1562192873796)(pics/搜狗截图20190520112135.png)]
dom4j 必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了。
常用API如下:
- SaxReader对象
a) read(…) 加载执行xml文档
- Document对象
a) getRootElement() 获得根元素
- Element对象
a) elements(…) 获得指定名称的所有子元素。可以不指定名称
b) element(…) 获得指定名称第一个子元素。可以不指定名称
c) getName() 获得当前元素的元素名
d) attributeValue(…) 获得指定属性名的属性值
e) elementText(…) 获得指定名称子元素的文本值
f) getText() 获得当前元素的文本内容
public static void main(String[] args) throws Exception {
SAXReader sax = new SAXReader();
Document document = sax.read("beans.xml");
Element elemRoot = document.getRootElement();
List<Element>list = elemRoot.elements();
for(Element element : list){
String id =element.attributeValue("id");
String className = element.attributeValue("className");
System.out.println(id+""+className);
List<Element>listElem = element.elements();
for(Element elem : listElem){
String name = elem.attributeValue("name");
String value = elem.attributeValue("value");
System.out.println(name+""+value);
}
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="001" className="com.baidu.demo.User">
<property name="user" value="jacl"></property>
<property name="user" value="rose"></property>
</bean>
<bean id="002" className="com.baidu.demo.Admin">
<property name="user" value="admin"></property>
<property name="user" value="write"></property>
</bean>
</beans>