java对XML文件的相关操作(dom4j)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对XML文件的相关操作(dom4j)相关的知识,希望对你有一定的参考价值。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <Person university="SCAU" location="GuangZhou">
 4     <student>
 5         <name>tester1</name>
 6     </student>
 7     <student>
 8         <name/>tester2
 9     </student>
10     <student>
11         <input type="text" value="forTest"/>
12     </student>
13     <student>
14         <name>hello world!</name>
15     </student>
16     <student>
17         <DONT att1="value1" att2="value2">don‘t use in this way!!!</DONT>
18     </student>
19 </Person>

上面就是XML文件的内容。

 

生成XML文件的相关代码

 1   public void create(){
 2         // 创建根节点 root
 3         Element root = DocumentHelper.createElement("Person");
 4         Document document = DocumentHelper.createDocument(root);
 5 
 6         // addAttribute 是指创建节点内的属性
 7         // :<Person university="SCAU" location="GuangZhou"> 其中university和location就是Person的属性。
 8         root.addAttribute("university","SCAU");
 9         root.addAttribute("location","GuangZhou");
10 
11         // 创建节点的方式。
12         // 而整个的dom树其实就是这么延伸下去的:将root看成一个节点,节点再添加节点(取数据的时候,套多个for循环就可以了)
13         Element e1 = root.addElement("student");
14         e1.addElement("name").addText("tester1");
15 
16         // 以这种方式添加节点的话,内容是这样子的:<name/>xiangxiao
17         // 有点类似 html 的 <input />标签。
18         // 这么说,通过这种方式来添加节点的话,多数是以添加 attribute 为目的的
19         Element e2 = root.addElement("student");
20         e2.addElement("name");
21         e2.addText("tester2");
22 
23         // 比如像下面这样
24         Element e3 = root.addElement("student");
25         Element ei = e3.addElement("input");
26         ei.addAttribute("type","text");
27         ei.addAttribute("value","forTest");
28 
29         // 下面这种添加节点的方式该是比较好理解的,
30         Element e4 = root.addElement("student");
31         Element ex = e4.addElement("name");
32         ex.addText("hello world!");
33 
34         // 当然,也可以写下面这种一锅端的方式:
35         Element DONT_USE = root.addElement("student");
36         DONT_USE.addElement("DONT").addAttribute("att1","value1").addAttribute("att2","value2").addText("don‘t use in this way!!!");
37 
38         OutputFormat format = new OutputFormat("    ",true);// 输出的格式,四个空格加换行,好像是约定俗称的吧
39         format.setEncoding("UTF8");
40         try {
41             XMLWriter writer = new XMLWriter(new FileOutputStream("Person.xml"),format);
42             writer.write(document);
43             writer.close();
44         } catch(Exception e){
45             e.printStackTrace();
46         }
47     }

 

从XML文件取出数据

  一:

 

 1     /**
 2      * 获取节点的方式一
 3      * 这种方式虽然看起来简单,但另一个方法更好理解一些
 4      */
 5     public void get(String filePath){
 6         try {
 7             File xmlFile = new File(filePath);
 8             SAXReader saxReader = new SAXReader();
 9 
10             Document document = saxReader.read(xmlFile);
11             // 获取根节点
12             Element Person = document.getRootElement();
13 
14             // 获取根节点的直接子节点
15             for(Iterator i = Person.elementIterator();i.hasNext();){
16                 // <student>...</student>
17                 Element student = (Element)i.next();
18                 for(Iterator j = student.elementIterator();j.hasNext();){
19                     // 子节点的直接子节点:<name>...</name>
20                     Element node = (Element)j.next();
21                     // 获取节点的名字与内容:name:xiaoxiang
22                     System.out.print(node.getName()+" : "+ node.getTextTrim());
23                 }
24                 System.out.println();
25             }
26         } catch(Exception e){
27             e.printStackTrace();
28         }
29     }

   二:

 1     /**
 2      * 获取节点的方式二
 3      * 根据父节点直接获取所有的子节点,同时也能获取该节点的所有属性
 4      */
 5     public void anotherGet(String filePath){
 6         try {
 7             File xml = new File(filePath);
 8             SAXReader saxReader = new SAXReader();
 9 
10             Document document = saxReader.read(xml);
11             Element Person = document.getRootElement();
12 
13             // 获取节点 person 的所有属性
14             // 以键值对的形式打印
15             List attrList = Person.attributes();
16             System.out.printf("this is attribute: \n");
17             for (int i = 0; i < attrList.size(); i++) {
18                 Attribute item = (Attribute)attrList.get(i);
19                 System.out.println(item.getName()+ " : "+item.getValue());
20             }
21 
22             // 获取节点 person 的所有子节点
23             // 在这个具体的例子中,就是 <student>、<student>..
24             List nodeList = Person.elements();
25             System.out.printf("this is element: \n");
26             for (int i = 0; i < nodeList.size(); i++) {
27                 Element student = (Element)nodeList.get(i);
28                 // 获取节点 node 的所有子节点
29                 List contentList = student.elements();
30                 for (int j = 0; j < contentList.size(); j++) {
31                     Element contentNode = (Element)contentList.get(j);
32                     System.out.println(contentNode.getName()+" : "+contentNode.getTextTrim());
33                 }
34             }
35 
36             // 根据dom树的结构,决定循环的次数。
37             // 一般是两层循环;当然也有可能更多,主要取决于一开始的设计。
38         } catch (Exception e) {
39             e.printStackTrace();
40         }
41     }

 

利用DOM4J对XML文件的基本操作大概就这么多,反正也不外乎读跟写嘛。

相关的 API (好像很久没更新的样子):http://www.oschina.net/uploads/doc/dom4j-1.6.1/index.html

maven的引用:

<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
   <groupId>dom4j</groupId>
   <artifactId>dom4j</artifactId>
   <version>1.6.1</version>
</dependency>

 

在具体的编程中,import 进的外部包有 (因为可能会与其他的包重叠,所以也顺带写一下吧):

import org.dom4j.*;

import org.dom4j.io*;

 

第一次用博客园写代码,用的好不习惯……

2017.8.7

以上是关于java对XML文件的相关操作(dom4j)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dom4j 对XML操作!!!

java中采用dom4j解析xml文件

Java解析XML之Dom4j

XML文件操作之dom4j

java基础之XML

Java操作XML牛逼利器JDOM&DOM4J