dom4j入门

一、XML解析方式(面试考点)

其实就是获取元素里面的字符数据或者属性数据

其中常用的两种解析方式:

  • DOM
  • SAX

DOM(document object model)

将整个xml全部读到内存当中,形成树形结构(所有的对象都叫做Node节点。)

整个文档---document对象
属性(标签内描述属性)---attribute对象
所有元素节点(stu/name/age等标签)---element对象
文本(文字等描述)---text对象

SAX(simple API for Xml)

基于事件驱动(读一行解析一行)


二、针对两种解析方式的API(Dom4j 入门)

  • jaxp sun公司(比较繁琐)
  • jdom
  • dom4j 使用广泛

Dom4j 基本用法(导入jar)

1.创建SAXReader对象

1
SAXReader reader=new SAXReader();

2.指定解析的xml原地址(SAXReader调用read方法)

1
Document document=reader.read(new File("src/xml/demo.xml"));  //整个文档叫做document对象

3.获取根元素(文档document对象调用getRootElement方法)

1
Element rootElement=document.getRootElement();

4.根据根元素—下面的元素

element.element  //一个stu元素
element.elements();  //所有stu元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//得到根元素的子元素 age (找两层element)
rootElement.element("stu").element("age");

//得到根元素下面的所有子元素(所有的stu)
List<Element> elements=rootElement.elements(); //泛型(stu/name/age)返回子元素stu

//遍历所有的stu元素
for(Element element :elements)
{
//获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String desc = element.element("desc").getText();
System.out.println("name="+name+" age+"+age+" desc="+desc);
}

具体实现::

demo.xml内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<stus>
<stu>
<name>李四</name>
<age>15</age>
<desc>我是老大</desc>
</stu>

<stu>
<name>网名</name>
<age>15</age>
<desc>我是老大</desc>
</stu>

</stus>

MainTest.java实现类内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package xml;
import java.io.File;
import java.util.List;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.sun.xml.internal.txw2.Document;
public class MainTest {
public static void main(String[] args){
//1.创建sax读取对象
SAXReader reader=new SAXReader();

try {
//2.指定解析的xml源
org.dom4j.Document document=reader.read(new File("src/xml/demo.xml")); //整个文档叫做document对象

//3.得到元素(element)

//得到根元素 getRootElement
Element rootElement=document.getRootElement();

//得到根元素的子元素 age (找两层element)
rootElement.element("stu").element("age");

//得到根元素下面的所有子元素(所有的stu)
List<Element> elements=rootElement.elements(); //泛型(stu/name/age)返回子元素stu

//遍历所有的stu元素
for(Element element :elements)
{
//获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String desc = element.element("desc").getText();
System.out.println("name="+name+" age+"+age+" desc="+desc);
}

} catch (DocumentException e) {

e.printStackTrace();
}

}
}

通过泛型遍历所有的文本text内容(getText())


三 、Dom4j中的Xpath入门(导入jar)

dom4j里面支持Xpath的写法。 xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速定位到具体的某一个元素。

  • 不同之处:

如果需要获得单个的name:

1
2
3
4
5
Dom4j里面是根节点.element()方法:
rootElement.element("stu").element("age");

Xpath里面是根节点.selectSingleNode("具体的//或者/行为")方法;
Element nameElement=(Element) rootElement.selectSingleNode("//name");

如果需要获得所有的name:

1
2
3
4
5
Dom4j里面是根节点.elements()方法:
List<Element> elements=rootElement.elements(); //泛型(stu/name/age)返回子元素stu

Xpath里面是根节点.selectNodes("具体的//或者/行为")方法;
List<Element> elements= rootElement.selectNodes("//name"); //泛型(stu/name/age)返回子元素stu

完整代码如下(xml一样只是展示Xpath的不同):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package xml;
import java.io.File;
import java.util.List;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XpathTest {
public static void main(String[] args){
//1.创建sax读取对象
SAXReader reader=new SAXReader();

try {
//2.指定解析的xml源
org.dom4j.Document document=reader.read(new File("src/xml/demo.xml")); //整个文档叫做document对象

//3.得到元素(element)

//得到根元素 getRootElement
Element rootElement=document.getRootElement();

//要想使用Xpath,还需要支持的jar(获取的是第一个,只返回一个)
Element nameElement=(Element) rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText());

System.out.println("-----------");

List<Element> elements= rootElement.selectNodes("//name"); //泛型(stu/name/age)返回子元素stu
//遍历所有的stu元素
for(Element element :elements)
{
System.out.println(element.getText());
}


} catch (DocumentException e) {
e.printStackTrace();
}

}
}

两者对比如下:


四、XML约束

  • DTD
  • Schema

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 一、XML解析方式(面试考点)
    1. 1.1. DOM(document object model)
    2. 1.2. SAX(simple API for Xml)
  2. 2. 二、针对两种解析方式的API(Dom4j 入门)
    1. 2.1. Dom4j 基本用法(导入jar)
  3. 3. 三 、Dom4j中的Xpath入门(导入jar)
  4. 4. 四、XML约束
,