开发中比较常见的解析方式有三种,如下:

1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。

a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

b) 缺点:XML文档过大,可能出现内存溢出显现。

2. SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)

a) 优点:处理速度快,可以处理大文件

b) 缺点:只能读,逐行后将释放资源。

3. PULL:Android内置的XML解析方式,类似SAX。()

常见的解析开发包:

:sun公司提供支持DOM和SAX开发包

:dom4j兄弟

:一种处理HTML特定解析开发包

:比较常用的解析开发包,hibernate底层采用。

下载地址:

https://dom4j.github.io/

dom4j包中常用的API:

1. SaxReader对象

a) read(…) 加载执行xml文档

2. Document对象

a) getRootElement() 获得根元素

3. Element对象

a) elements(…) 获得指定名称的所有子元素。可以不指定名称

b) element(…) 获得指定名称第一个子元素。可以不指定名称

c) getName() 获得当前元素的元素名

d) attributeValue(…) 获得指定属性名的属性值

e) elementText(…) 获得指定名称子元素的文本值

f) getText() 获得当前元素的文本内容

dom4j使用步骤:
1.导入jar包
2.创建一个核心对象 SAXReader
new SAXReader();
3.将xml文档加载到内存中形成一棵树
Document doc=reader.read(文件)
4.获取根节点
Element root=doc.getRootElement();
5.通过根节点就可以获取其他节点(文本节点,属性节点,元素节点)
获取所有的子元素
List<Element> list=root.elements()
获取元素的指定属性内容
String value=root.attributeValue("属性名");
获取子标签标签体:遍历list 获取到每一个子元素
String text=ele.elementText("子标签名称")

使用案例:

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app version="2.5">
<servlet>
<servlet-name>HelloMyServlet</servlet-name>
<servlet-class>cn.itcast.HelloMyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloMyServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
 </web-app>


java代码:

public class Dom4jDemo {

public static void main(String[] args) throws Exception {
//创建核心对象
SAXReader reader = new SAXReader();
//获取dom树
Document document = reader.read("D:\\workspace\\javaEE\\mar\\xmlAndTomcat\\xml\\web.xml");
//获取根节点(元素)
Element rootElement = document.getRootElement();
//获取所有子节点
List<Element> list = rootElement.elements();
//遍历所有子元素
for (Element element : list) {
//获取子元素名称
String childEleName = element.getName();
System.out.println("子元素名称:"+childEleName);
//处理servlet元素,并其标签的内容
if ("servlet".equals(childEleName)) {
// 方式1:获得元素对象,然后获得文本
Element servletNameElement = element.element("servlet-name");
String t = servletNameElement.getText();
System.out.println("servlet-name的标签体:"+t+"------");
//方式2:获取子元素servlet-name内容
String text = element.elementText("servlet-name");
      System.out.println("servlet-name的标签体:"+text+"---方式1是方式二的简化版,结果一样!---");
}

}
//获取根节点的version属性
String value = rootElement.attributeValue("version");
System.out.println("根节点的属性:"+value);
}
 }