Dom4j解析xml文件
Posted jesus-chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dom4j解析xml文件相关的知识,希望对你有一定的参考价值。
注:使用dom4j解析xml 需要对应的jar包,这里使用的是 dom4j-1.6.1.jar
xml文件如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <students>
3 <student id="01" type="good" color="white">
4 <name>小明</name>
5 <age>12</age>
6 <gender>男</gender>
7 </student>
8 <baby id="02" type="clear" color="yellow">
9 <name>小胖</name>
10 <age>10</age>
11 <gender>男</gender>
12 </baby>
13 <student id="03" type="easy" color="red">
14 <name>小红</name>
15 <age>13</age>
16 <gender>女</gender>
17 </student>
18 </students>
结构如下:
解析代码如下:
1 package com.dom4j;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import org.dom4j.Attribute;
9 import org.dom4j.Document;
10 import org.dom4j.DocumentHelper;
11 import org.dom4j.Element;
12 import org.dom4j.io.OutputFormat;
13 import org.dom4j.io.SAXReader;
14 import org.dom4j.io.XMLWriter;
15
16 public class Dom4jTest {
17 public static void main(String[] args) throws Exception {
18 readText();
19 createXml();
20 add();
21 delete();
22 }
23
24 /**
25 * 读取xml文件
26 *
27 * @throws Exception
28 */
29 public static void readText() throws Exception {
30 // 创建解析器对象SAXReader
31 SAXReader reader = new SAXReader();
32 // 通过解析器将xml文件转换为Document对象
33 // (注意:如果是解析xml形式的文本,用如下方式:Document document = DocumentHelper.parseText(text);)
35 Document document = reader.read(new File("src/com/xml/students.xml"));
36 // 获取document的根节点,也就是xml文件的根节点 <students>
37 Element root = document.getRootElement();
38
39 // 获取根节点下所有的子节点
40 List allList = root.elements();
41 // 获取根节点下所有名称为 student 的子节点
42 List studentList = root.elements("student");
43
44 // 如何获取节点下的属性值(例如 baby节点下type的值)
45 // 先获取该节点
46 Element baby = root.element("baby");
47 // 通过节点获取属性
48 Attribute attribute = baby.attribute("type");
49 // 得到属性的值
50 String text = attribute.getText();
51 // 当然,还有更直接的方式
52 String text1 = baby.attributeValue("type");
53 System.out.println(text1);
54
55 // 获取所有属性值(方法一)
56 List attributes = baby.attributes();
57 for (int i = 0; i < attributes.size(); i++) {
58 Attribute att = (Attribute) attributes.get(i);
59 String text2 = att.getText();
60 System.out.println(text2);
61 }
62 // 获取所有属性值(方法二)
63 for (Iterator it = baby.attributeIterator(); it.hasNext();) {
64 Attribute att = (Attribute) it.next();
65 String text2 = att.getText();
66 System.out.println(text2);
67 }
68
69 // 如何获取到 小明 呢
70 // 先通过根节点取到 student 节点
71 Element student = root.element("student");
72 // 再通过 student 节点取到 name 节点
73 Element name = student.element("name");
74 // 获取 name 节点的文本就好啦
75 String nametext = name.getText();
76 // 到这里大家可能会有疑问,明明有两个 student 节点,你怎么知道取到的是哪一个,嘿嘿,
77 // 如果有多个符合条件的子节点,root.element()方法会自动获取第一个,你要说那后面的怎么取,自己想咯
78 // 其实也就是for循环加一个 if判断 的事
79 }
80
81 /**
82 * 创建xml文档
83 *
84 * @throws Exception
85 */
86 public static void createXml() throws Exception {
87 // 创建Document对象
88 Document doc = DocumentHelper.createDocument();
89 // 添加根节点 students
90 Element students = doc.addElement("Students");
91
92 // 在根节点下添加子节点 student
93 Element student1 = students.addElement("student");
94 // 为 student 节点添加属性(注:addAttribute()方法
95 // 如果不存在此条属性,会添加,如果已经存在此属性,则会将此属性的值改为现在设置的值)
96 student1.addAttribute("id", "01");
97 student1.addAttribute("type", "good");
98 student1.addAttribute("color", "white");
99 // 在student节点下再创建子节点
100 Element name1 = student1.addElement("name");
101 name1.setText("小明");
102 Element age1 = student1.addElement("age");
103 age1.setText("12");
104 Element gender1 = student1.addElement("gender");
105 gender1.setText("男");
106
107 // 在根节点下添加子节点 baby
108 Element baby = students.addElement("baby");
109 // 为 baby 节点添加属性
110 baby.addAttribute("id", "02");
111 baby.addAttribute("type", "clear");
112 baby.addAttribute("color", "yellow");
113 // 在baby节点下再创建子节点
114 Element name2 = baby.addElement("name");
115 name2.setText("小胖");
116 Element age2 = baby.addElement("age");
117 age2.setText("10");
118 Element gender2 = baby.addElement("gender");
119 gender2.setText("男");
120
121 // 在根节点下再添加子节点 student
122 Element student2 = students.addElement("student");
123 // 为 student 节点添加属性
124 student2.addAttribute("id", "03");
125 student2.addAttribute("type", "easy");
126 student2.addAttribute("color", "red");
127 // 在student节点下再创建子节点
128 Element name3 = student2.addElement("name");
129 name3.setText("小红");
130 Element age3 = student2.addElement("age");
131 age3.setText("13");
132 Element gender3 = student2.addElement("gender");
133 gender3.setText("女");
134
135 // 创建格式化工具
136 OutputFormat format = OutputFormat.createPrettyPrint();
137 // 设置编码
138 format.setEncoding("UTF-8");
139 XMLWriter writer = new XMLWriter(new FileOutputStream("src/com/xml/students1.xml"), format);
140 writer.write(doc);
141 writer.close();
142
143 }
144
145 /**
146 * 在指定位置添加节点
147 *
148 * @throws Exception
149 */
150 public static void add() throws Exception {
151 SAXReader reader = new SAXReader();
152 Document document = reader.read(new File("src/com/xml/students1.xml"));
153 Element root = document.getRootElement();
154
155 // 先创建一个节点
156 Element dog = DocumentHelper.createElement("dog");
157 dog.setText("二哈");
158 // 先获得students所有的子节点
159 List list = root.elements();
160 // 把新创建的节点插进去
161 list.add(2, dog);
162
163 OutputFormat format = OutputFormat.createPrettyPrint();
164 format.setEncoding("UTF-8");
165 XMLWriter writer = new XMLWriter(new FileOutputStream("src/com/xml/students1.xml"), format);
166 writer.write(document);
167 writer.close();
168 }
169
170 /**
171 * 删除节点
172 *
173 * @throws Exception
174 */
175 public static void delete() throws Exception {
176 SAXReader reader = new SAXReader();
177 Document document = reader.read(new File("src/com/xml/students1.xml"));
178 Element root = document.getRootElement();
179
180 Element dog = root.element("dog");
181 dog.getParent().remove(dog);
182
183 OutputFormat format = OutputFormat.createPrettyPrint();
184 format.setEncoding("UTF-8");
185 XMLWriter writer = new XMLWriter(new FileOutputStream("src/com/xml/students1.xml"), format);
186 writer.write(document);
187 writer.close();
188 }
189
190 // 至于修改就不用说了,无论是节点还是属性,先拿到你需要修改的节点或属性,然后使用 setText()方法重新赋值就可以了
191 // 删除属性就更简单了,例如删除 baby节点的 type 属性:baby.remove("type");
192
193 }
以上是关于Dom4j解析xml文件的主要内容,如果未能解决你的问题,请参考以下文章