1 package com.sxd.dom4j.test;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.nio.file.Files;
8 import java.util.List;
9
10 import org.dom4j.Attribute;
11 import org.dom4j.Document;
12 import org.dom4j.DocumentException;
13 import org.dom4j.DocumentHelper;
14 import org.dom4j.Element;
15 import org.dom4j.io.OutputFormat;
16 import org.dom4j.io.SAXReader;
17 import org.dom4j.io.XMLWriter;
18 import org.junit.Test;
19
20 public class Dom4jTest {
21
22 @Test
23 public void mainTest() throws IOException, DocumentException{
24
25 // createXML();//创建XML文件
26 // queryXMLByXPath();//查找XML文件
27 // queryXMLByDom4j();//查找XML文件
28 // queryXMLByReadXML();//查找XML文件
29 updateOdeleteXML();//修改或删除元素
30 }
31 /**
32 * 创建 XML文件
33 * @throws IOException
34 */
35 public void createXML() throws IOException{
36 OutputStream out = new FileOutputStream(new File("d:/testXMLFile.xml"));
37 //XMLWriter生成物理文件
38 //但是一般生成的xml文件内容比较紧凑
39 //调用OutputFormat.createPrettyPrint()或者OutputFormat.createCompactFormat()方法可以使XML文件内容格式化输出
40 XMLWriter writer = new XMLWriter(out, OutputFormat.createPrettyPrint());
41
42 //Document定义了XML 文档
43 Document document = DocumentHelper.createDocument();
44
45 //设置根节点
46 Element elementRoot = document.addElement("根节点");
47 document.setRootElement(elementRoot);
48 /**
49 * Element和Node的区别在于:
50 * 1.Element代表一个对象,对象中有属性,属性有属性值,对象有文本
51 * 例如:<bean id="myTestBean" class="com.sxd.spring.test1.MyTestBean">测试bean</bean>
52 * 就是一个完整的Element
53 * 2.Node代表任意一个节点,可以是上面的Element,也可以是Element中的某个属性
54 * 例如:id="myTestBean"可以是一个Node
55 * <bean id="myTestBean" class="com.sxd.spring.test1.MyTestBean">测试bean</bean> 也可以是一个Node
56 */
57
58 Element element1 = elementRoot.addElement("一层节点");
59 element1.addAttribute("属性名1","属性值1");
60
61 Element element2_1 = element1.addElement("二层节点");
62 element2_1.addAttribute("id", "attr2_1").addAttribute("name", "attr2_1");
63 Element element2_2 = element1.addElement("二层节点");
64 element2_2.addAttribute("id", "attr2_2").addAttribute("name", "attr2_2");
65 Element element2_3 = element1.addElement("二层节点");
66 element2_3.addAttribute("id", "attr2_3").addAttribute("name", "attr2_3");
67 /**
68 * <beans>text</beans>
69 */
70 element2_2.addText("开始节点和结束节点之间的文本文字");
71 /**
72 * 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
73 */
74 element2_3.addCDATA("CDATA中的文本 是xml不应该解析的文本数据,一般放置为包含<或者&这种特殊字符的文本");
75
76 writer.write(document);
77 writer.close();
78 }
79
80
81
82 /**
83 * 查看 XML文件 使用SAXReader----使用了xpath解析
84 * @throws DocumentException
85 */
86 public void queryXMLByXPath() throws DocumentException{
87 SAXReader reader = new SAXReader();
88 Document document = reader.read(new File("d:/testXMLFile.xml"));
89 //使用XPath语法 selectNodes()方法得到所有的Element 这里需要Jaxen是一个开源的XPath库
90 List<Element> list = document.selectNodes("根节点|一层节点|二层节点");
91 if(!list.isEmpty() && list!=null && list.size()>0){
92 for (Element element : list) {
93 just4Element(element);
94 }
95 }
96 }
97
98 /**
99 * 递归 抽离element
100 * @param element
101 */
102 public void just4Element(Element element){
103 justPlayElement(element);
104 List<Element> list = element.elements();
105 if(!list.isEmpty() && list.size()>0 && list!=null){
106 for (Element e : list) {
107 just4Element(e);
108 }
109 }
110 }
111
112
113 /**
114 * 重载 展示element信息 默认展示属性信息
115 * @param element
116 */
117 public void justPlayElement(Element element){
118 boolean showSon = true;
119 justPlayElement(element,showSon);
120 }
121
122 /**
123 * 展示element信息
124 * @param element
125 */
126 public void justPlayElement(Element element,boolean showSon){
127 System.out.println("节点名称:"+element.getName());
128 System.out.println("节点文本:"+element.getText());
129 int attributeSum = element.attributeCount();
130 System.out.println("节点属性个数:"+attributeSum);
131 //或者
132 if(showSon){
133 List<Attribute> attList = element.attributes();
134 if(attList!= null && attList.size()>0){
135 for (Attribute attribute : attList) {
136 System.out.println("节点"+element.getName()+"的属性->"+attribute.getName()+":"+attribute.getValue());
137 }
138 }
139 }
140
141 System.out.println("----------------------------------------------------------------------------------------");
142
143 }
144
145
146 /**
147 * 查看 XML文件 使用SAXReader --纯dom4j解析
148 * @throws DocumentException
149 */
150 public void queryXMLByDom4j() throws DocumentException{
151 SAXReader reader = new SAXReader();
152 Document document = reader.read(new File("d:/testXMLFile.xml"));
153 //先得到根节点
154 Element element = document.getRootElement();
155 if(element!= null){//然后调用递归 去取出 根节点中所有结点信息
156 just4Element(element);
157 }
158 }
159
160 /**
161 * 查看 XML文件 通过读取XML字符串的方式
162 * @throws IOException
163 * @throws DocumentException
164 */
165 public void queryXMLByReadXML() throws IOException, DocumentException{
166 File file = new File("d:/testXMLFile.xml");
167 List<String> list = Files.readAllLines(file.toPath());
168 StringBuilder xmlStr = new StringBuilder();//优先使用StringBuilder[单线程 速度更快]
169 for (String string : list) {
170 xmlStr.append(string);
171 }
172 //将字符串转化为XML
173 Document document = DocumentHelper.parseText(xmlStr.toString());
174 //先得到根节点
175 Element element = document.getRootElement();
176 if(element!= null){//然后调用递归 去取出 根节点中所有结点信息
177 just4Element(element);
178 }
179 }
180
181 /**
182 * 修改XML文件内容
183 * @throws DocumentException
184 * @throws IOException
185 */
186 public void updateOdeleteXML() throws DocumentException, IOException{
187 SAXReader reader = new SAXReader();
188 Document document = reader.read(new File("d:/testXMLFile.xml"));
189 Element elementRoot = document.getRootElement();
190 Element element = (Element) elementRoot.selectSingleNode("一层节点");
191 justPlayElement(element,true);//调用 展示标签信息 不展示子层信息
192
193
194 element.addAttribute("属性名2", "属性值2");
195 element.addText("一层节点的文本 是修改之后的结果");
196 element.setAttributeValue("属性名1", "修改之后的属性值1");//Deprecated. As of version 0.5. Please use addAttribute(QName, String) instead. WILL BE REMOVED IN dom4j-1.6 !!
197 element.addAttribute("属性名1", "二次修改之后的属性值1");
198
199 justPlayElement(element);//展示 修改之后的 元素信息
200
201 List<Element> elements = element.elements();
202 for (Element element2 : elements) {
203 if(element2.attributeValue("id").equals("attr2_1")){
204 element2.getParent().remove(element2);
205 }
206 }
207
208 OutputStream outputStream = new FileOutputStream("d:/testXMLFile.xml");
209 XMLWriter writer = new XMLWriter(outputStream, OutputFormat.createPrettyPrint());
210 writer.write(document);
211 writer.close();
212
213 }
214
215
216
217
218
219
220 }