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文件的主要内容,如果未能解决你的问题,请参考以下文章

java中采用dom4j解析xml文件

使用dom4j创建和解析xml文件

dom4j解析xml文件,红框里面的是干嘛用的。

1.使用dom4j解析XML文件

Java解析XML之Dom4j

解析和操作XML文件