目录
- 一、dom4j简介
- 二、XML文档操作
- 1.添加依赖
- 2.读取XML文件,获得document对象
- 3.节点操作
- 4.属性操作
- 5.将文档写入XML文件
- 6.添加节点(示例)
- 7.删除节点(示例)
- 8.XPath 语法
一、dom4j简介
dom4j就是一个开源的、简易的可以帮助java解析xml文件的api 。
dom4j官网下载地址:https://dom4j.github.io
二、XML文档操作
1.添加依赖
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
2.读取XML文件,获得document对象
代码如下(示例):
public static Document read(String filename) {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filename));
return document;
}
3.节点操作
代码如下(示例):
public static Document operate(String filename) {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filename));
// 获取文档根节点
Element rootElm = document.getRootElement();
// 取得某个节点的子节点.
Element node=rootElm.element("节点名称");
// 在某节点下添加子节点.
Element childNode = node.addElement("子节点名称");
// 获取节点文字
String text=childNode.getText();
// 设置节点文字
childNode.setText("节点文字");
// 删除节点
parentElm.remove(childElm);
return document;
}
4.属性操作
代码如下(示例):
public static Document attrOperate(String filename) {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filename));
// 获取文档根节点
Element rootElm = document.getRootElement();
// 获取节点下的指定属性
Attribute attribute=rootElm.attribute("属性名");
// 获取属性的文字
String text=attribute.getText();
// 删除属性
rootElm.remove(attribute);
// 设置节点的属性和文字.
newMemberElm.addAttribute("属性名", "文字");
// 设置属性的文字
attribute.setText("文字");
return document;
}
5.将文档写入XML文件
代码如下(示例):
public static void writeXml(Document document, String filename) {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileWriter(filename),format);
writer.write(document);
writer.close();
}
6.添加节点(示例)
public static void addAttribute(String filename) {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filename));
// 需要插入的父节点
Element parentElement = document.getRootElement().element("books");
// 插入子节点
Element childElement = parentElement.addElement("book");
//设置子节点属性name值
childElement.addAttribute("name", "java");
// 子节点下插入节点
Element price = childElement.addElement("price");
//设置节点属性name值
price.addAttribute("name", "price");
// 设置节点文字
price.setText("30");
// 写入文档
writeXml(document,filename);
}
结果示例:
<books>
<book name="css">
<price>20</price>
</book>
<book name="java">
<price name="price">30</price>
</book>
</books>
7.删除节点(示例)
public static void remove(String filename) {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filename));
Element parentElement = document.getRootElement().element(parentElm);
// 使用xpath找到指定节点属性name值为java
Node node = document.selectSingleNode("//book[@name='java']");
parentElement.remove(node);
// 写入文档
writeXml(document,filename);
}
8.XPath 语法
表达式 | 描述 |
books | 选取 books 节点下所有子节点 |
/books | 选取根节点 books |
books/book | 选取 books 下名为 book 的所有子节点 |
//book | 选取所有 book 子节点,不管它们在文档中的位置 |
//@name | 选取所有名为 name 的属性 |
/books/book[1] | 选取属于 books 子节点的第一个 book 节点 |
/books/book[last()] | 选取属于 books 子节点的最后一个 book 节点 |
/books/book[last()-1] | 选取属于 books 子节点的倒数第二个 book 节点 |
/books/book[position()< 3] | 选取前两个属于 books 节点的子节点的 book 节点 |
//book[@name] | 选取所有拥有名为 name 的属性的 book 节点 |
//book[@name=‘css’] | 选取所有 book 节点,要求这些节点拥有值为 css 的 name 属性 |
/books/book[price>20] | 选取所有 books 节点的 book 节点,要求book节点的子节点 price 节点的值须大于 20 |