dom4j解析XML
一. 什么是XML
XML(e**X**tensible **M**arkup **L**anguage)
,是一种可扩展的标记语言,是一种用于标记电子文件使其具有结构性的标记语言。
XML技术是\W3C
**组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C
组织于1998年2月10日发布的XML1.0
规范。
二. 示例
1 |
|
三. 语法
<?xml version=“1.0” encoding=“UTF-8”?>
特殊字符
XML文档约束
dtd
约束:Document Type Definition文档类型定义,它使用一系列的合法元素来定义文档结构**。**1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17使用ELEMENT关键字来声明一个XML元素
语法:
文档类型声明以
ANY:用于指示元素的主体内容为任意类型
(子元素):指示元素中包含的子元素
定义子元素及描述它们的关系:
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如果子元素用“|”分开,说明任选其一。
用+、*、?来表示元素出现的次数
如果元素后面没有+*?:表示必须且只能出现一次
+:表示至少出现一次,一次或多次
*:任意次。表示可有可无,零次、一次或多次
?:表示可以有也可以无,有的话只能有一次。零次或一次对
books.xml
进行约束1
2
3
4
5
6<!ELEMENT books (book+)>
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book id>
<!ATTLIST book publish>schema约束
在上面的
dtd
约束中,我们发现,约束文件本身只是一个文本文件,在属性约束文件的时候,也是容易出现错误的,所以,这种约束存在较大的限制性。所以,需要另外一种更加强大的约束:schema约束。Schema的功能比dtd
更加强大,但是配置起来更加复杂!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://coderyech.cn" elementFormDefault="qualified">
<xs:element name="books">
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name='name' type='xs:string' />
<xs:element name='price' type='xs:double' />
</xs:sequence>
<xs:attribute name="id" type="xs:long" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
四. DOM模型
- DOM:文档对象模型,将一个
XML(html)
文档的每一个\元素**解析成Java中的一个对象
D | Document | 文档(XML文档) : 磁盘上面的xml 文件 |
---|---|---|
O | Object | 对象(Java对象) : 把xml 文件中成员转换成Java对象 |
M | Model | 模型:xml 文件与Java中对象一一对应的关系 |
在Java使用了如下类型来描述上面的
xml
文档| Node(节点) |
| :——————— |
| Element (元素) |
| Attribute(属性) |
| Text(文本) |
五. DOM4J (Document Object Model for Java)
导入资源包,地址
准备一个xml文件,对其进行增删改查
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
<contacts>
<linkman id="100">
<name>gg</name>
<email>[email protected]</email>
<address>成都</address>
<group>二仙桥</group>
</linkman>
<linkman id="200">
<name>mm</name>
<email>[email protected]</email>
<address>成都</address>
<group>成华大道</group>
</linkman>
<linkman id="500">
<name>coderyeah</name>
<email>[email protected]</email>
<address>上海</address>
<group>松江大学城</group>
</linkman>
<linkman id="600">
<name>莱昂纳多</name>
<email>[email protected]</email>
<address>美国纽约</address>
<group>好莱坞</group>
</linkman>
</contacts>测试类
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127public class Dom4jTest {
public void testDel() throws Exception {
final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml");
//删除最后一个linkman节点
SAXReader reader = new SAXReader();
final Document dom = reader.read(file);
final Element root = dom.getRootElement();
final List<Element> elements = root.elements();
//获取集合最后一个节点
final Element element = elements.get(elements.size() - 1);
//通过获取父节点删除自身节点
final boolean remove = element.getParent().remove(element);
//将修改的dom写出文件去
XMLWriter writer = new XMLWriter(new FileWriter(file), OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
if (remove) {
System.out.println("删除成功");
}
}
public void testAdd() throws DocumentException, IOException {
final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml");
//在根节点新增一个linkman节点
SAXReader saxReader = new SAXReader();
//获取dom对象
final Document dom = saxReader.read(file);
final Element rootElement = dom.getRootElement();//得到根接点
//添加新节点 返回的是新添加节点
final Element element = rootElement.addElement("linkman");
//在新节点下添加其他节点 和属性
element.addAttribute("id", "600");
element.addElement("name").setText("莱昂纳多");
element.addElement("email").setText("[email protected]");
element.addElement("address").setText("美国纽约");
element.addElement("group").setText("好莱坞");
//同步文本到文件
OutputFormat format = OutputFormat.createPrettyPrint();//格式化写入 更美观
// final OutputFormat format = OutputFormat.createCompactFormat();//使其不格式化 不美观
XMLWriter writer = new XMLWriter(new FileWriter(file), format);
writer.write(dom);
writer.close();
}
public void testUpdate() throws DocumentException, IOException {
//修改linkman的id为500的name为coderyeah
//1.创建对象
SAXReader reader = new SAXReader();
final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml");
//2.得到文本对象
final Document dom = reader.read(file);
//3.获取根节点
final Element rootElement = dom.getRootElement();
//4.获取根节点下的所有子元素
final List<Element> elements = rootElement.elements();
//5.遍历集合
for (Element element : elements) {
if ("500".equals(element.attributeValue("id"))) {
//6.获取当前节点下的name节点
final Element name = element.element("name");
//7.给节点text重新赋值
name.setText("coderyeah");
//8.同步文本--把内存中的文本同步到文件中
//9.创建文本同步对象
XMLWriter writer = new XMLWriter(new FileWriter(file));
writer.write(dom);//写出文档
writer.close();
}
}
}
public void testQuery() throws DocumentException {
SAXReader saxReader = new SAXReader();
//获取DOM文档对象
final Document document = saxReader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"));
//获取根节点
final Element rootElement = document.getRootElement();
System.out.println(rootElement);
//获取根节点下所有linkman元素
final List<Element> elements = rootElement.elements();
System.out.println(elements.size());//3
//查询id为200的name值
for (Element element : elements) {
//获取id值
// System.out.println(element.attribute("id"));
final Attribute attribute = element.attribute("id");
// System.out.println(attribute.getValue());//得到所有id值
System.out.println("---------------------");
System.out.println(element.attributeValue("id"));//也可以得到所有id值
if ("500".equals(element.attributeValue("id"))) {
System.out.println("d为200的name值=" + element.element("name").getText());
System.out.println("d为200的address值=" + element.element("address").getText());
System.out.println("d为200的group值=" + element.element("group").getText());
}
}
}
public void testOne() throws DocumentException {
SAXReader saxReader = new SAXReader();
final Document document = saxReader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"));
System.out.println(document);//获取文档
}
public void selectTest() throws DocumentException {
//建SaxReader对象
SAXReader reader = new SAXReader();
//读取待解析的xml文件 得到文档模型
final Document document = reader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\books.xml"));
//获取根节点
final Element rootElement = document.getRootElement();
System.out.println("根节点标签名:" + rootElement.getName());//books
final Element element = rootElement.element("book");
System.out.println(element.attribute("id"));
}
}
评论