版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34928644/article/details/81976507
Dom4j是一个开源、灵活的XML API。
目前很多开源框架如struts,hibernate都使用dom4j做为解析其xml的工具。
支持文档的读写功能和Xpath快速查询操作。
准备DOM4j:
包:dom4j.x.jar
包结构:
org.dom4j
类
•org.dom4j.io.SAXReader – xml文档解析器
•org.dom4j.Document、Element – 文档对像
•Element的一些方法
•Element.element(“name”) –此元素下的第一个name元素。
•Element.elementIterator(“name”) – 此元素下的所有name元素。返回Iterator
•Element.getText() – 返回元素包含的文本。
•Element.getAttribute(“name”) – 返回名称为name的属性。
•Element.addElement(“name”); - 添加一个name元素,同时返回name元素本身。
org.dom4j.io.XMLWriter – 将Document写出的对像。
准备XML数据:
文件放在在当前项目新建目录:xml 下,文件名:users.xml
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="u001">
<name>jack</name>
<age>22</age>
</user>
<user id="u002">
<name>张三</name>
<age>20</age>
</user>
<user id="u003">
<name>Rose</name>
<age>20</age>
</user>
<student id="s007">
<name>王同学</name>
<age>21</age>
</student>
</users>
文件放在在当前项目新建目录:xml 下,文件名:xpathDemo.xml
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<aaa id="ra">
<bbb id="rab"></bbb>
<ccc id="rac">
<bbb id="racb"></bbb>
</ccc>
</aaa>
<bbb id="rb">
<ccc id="rbc"></ccc>
</bbb>
</root>
代码演示:
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class Dom4jDemo {
private Document dom;
@Before
public void Before() throws Exception {
//获取org.dom4j.io.SAXReader对象
SAXReader reader = new SAXReader();
//读取xml文件到内存中
dom = reader.read("./xml/users.xml");
}
@After
public void After() throws Exception {
/*
//获取org.dom4j.io.XMLWriter对象
XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
//把dom对象序列化(持久化)
writer.write(dom);
//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
writer.close();
*/
}
@Test
public void helloDom4j() {
//执行这里时会先执行被@Before注解的函数
Element root = dom.getRootElement();
System.out.println(root.getName()); //users //ok
//这里执行完毕后会执行被@After注解的函数
}
//查询:查询每个user的信息
@Test
public void query() {
Element root = dom.getRootElement();
@SuppressWarnings("unchecked")
List<Element> eUserList = root.elements("user");
for (Element eUser : eUserList) {
String id = eUser.attributeValue("id");
//获取元素的文本内容
//法1
String name = eUser.element("name").getTextTrim();
//法2
String age = eUser.elementTextTrim("age");
System.out.println(id+","+name+","+age);
}
System.out.println("------------------");
//下面演示Iterator遍历
@SuppressWarnings("unchecked")
Iterator<Element> iterator = root.elementIterator("user");
while(iterator.hasNext()) {
Element eUser = iterator.next();
String id = eUser.attributeValue("id");
//获取元素的文本内容
//法1
String name = eUser.element("name").getTextTrim();
//法2
String age = eUser.elementTextTrim("age");
System.out.println(id+","+name+","+age);
}
}
//添加:添加一个学生信息
@Test
public void add() throws Exception {
Element root = dom.getRootElement();
//相对于标准的dom 方法 dom4j第三方工具就简单多了
Element eStudent = root.addElement("student");
//给eStudent元素添加属性
eStudent.addAttribute("id", "s001");
//给eStudent添加子元素<name>
Element eName = eStudent.addElement("name");
//设置<name>元素的文本内容
eName.setText("宋同学");
//给eStudent添加子元素<age>并且设置文本内容
eStudent.addElement("age").setText("18"); //一步到位
//注意上面只是对内存中dom树的操作,并不是修改xml文件
//所以需要把内存的dom树序列化(持久化)
//获取org.dom4j.io.XMLWriter对象
XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
//把dom对象序列化(持久化)
writer.write(dom);
//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
writer.close();
}
//添加:刪除根元素<users>的最后一个子元素
@Test
public void delLast() throws Exception {
Element root = dom.getRootElement();
@SuppressWarnings("unchecked")
List<Element> elements = root.elements();
if ( elements.size() <= 0 ) {
return;
}
Element element = elements.get(elements.size()-1);
//找父亲删除自己
element.getParent().remove(element);
//注意上面只是对内存中dom树的操作,并不是修改xml文件
//所以需要把内存的dom树序列化(持久化)
//获取org.dom4j.io.XMLWriter对象
XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
//把dom对象序列化(持久化)
writer.write(dom);
//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
writer.close();
}
//演示一下格式化输出
@Test
public void format() throws Exception {
//紧凑型输出
//OutputFormat format = OutputFormat.createCompactFormat();
//漂亮型输出 -- 会有换行
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(
new PrintWriter("./xml/users.xml"),
format );
writer.write(dom);
writer.close();
//查看一下xml文件观察哦
}
//添加:修改根元素<users>的最后一个子元素
@Test
public void updateLast() throws Exception {
Element root = dom.getRootElement();
@SuppressWarnings("unchecked")
List<Element> elements = root.elements();
if( elements.size() <= 0 ) {
return;
}
Element element = elements.get(elements.size()-1);
//注意dom4j中修改和添加属性都是采用addAttribute方法
element.addAttribute("id", "s007");
element.element("name").setText("王同学");
//注意addText与addAttribute是不同的
//addText是在原有的基础上进行追加
//而addAttribute如果有内容就是修改,如果没有就是添加
//element.element("age").addText("66");
element.element("age").setText("21");
//注意上面只是对内存中dom树的操作,并不是修改xml文件
//所以需要把内存的dom树序列化(持久化)
//获取org.dom4j.io.XMLWriter对象
XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
//把dom对象序列化(持久化)
writer.write(dom);
//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
writer.close();
}
@Test
public void xpathHello() {
String xpath = "//user"; //获取dom树上所有<user>元素
@SuppressWarnings("unchecked")
List<Element> selectNodes = dom.selectNodes(xpath);
for (Element element : selectNodes) {
String id = element.attributeValue("id");
//获取元素的文本内容
String name = element.elementTextTrim("name");
String age = element.elementTextTrim("age");
System.out.println(id+","+name+","+age);
}
}
@Test
public void xpathDemo() throws Exception {
dom = new SAXReader().read("./xml/xpathDemo.xml");
// xpath中 祖先//后代 //前后是 "祖先与后代" 关系
// xpath中 父亲/孩子 //前后是直接 "父子" 关系
//String xpath = "//bbb"; //dom树下的所有bbb元素
String xpath = "//aaa/bbb"; //dom树下的所有aaa元素下的bbb直接子元素
@SuppressWarnings("unchecked")
List<Element> selectNodes = dom.selectNodes(xpath);
for (Element element : selectNodes) {
System.out.println( element.attributeValue("id") );
}
}
}