dom4j解析XML文件
理论分析
一般来说,dom4j解析xml文件分为以下几个步骤:
- 创建解析器
- 得到document文件
- 得到根节点
- 得到标签
- 对标签进行操作
在使用dom4j解析XML文件之前,我们须导入dom4j-1.6.1.jar
这个jar包。
先来说前面三个步骤:
-
创建解析器
-
得到document文件
-
得到根节点
这三个基本上是做任何操作都要有的,他们的代码是:
//创建解析器
SAXReader saxReader = new SAXReader();
//得到document文件
Document document = saxReader.read("XML文件的路径");
//得到根节点
Element root = document.getRootElement();
得到根节点之后,我们就可以获取到指定的标签了,采用element()
和elements()
方法。其中,element()
方法返回的是Element
,elements
返回的是List<Element>
。
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
Element root = document.getRootElement();
Element name1 = root.element("name"); //获取第一个name标签
List<Element> list = root.elements("name"); //获取所有name标签
从List中获取指定位置的标签我们可以使用get()
方法,有了标签之后,我们就可以对标签进行以西CRUD的操作了,其中遍历可以用增强for,增加标签用addElement()
,设置文本用setText()
,删除元素用remove()
。
注意:所有对XML文件进行修改的操作必须要进行回写!
回写:
OutputFormat format = OutputFormat.createPrettyPrint(); //包含缩进的格式
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("XML文件路径"),format);
xmlWriter.write(document);
xmlWriter.close();
具体实现
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1 id="aaaa">
<name>zhangsan</name>
<name>wangwu</name>
<School>AHUT</School>
<age>100</age>
<sex>nan/nv</sex>
<Weight>140</Weight>
</p1>
<p1 id="bbbb">
<name>lisi</name>
<age>20</age>
</p1>
</person>
dom4j解析XML文件:
package dom4jTest;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.util.EventListener;
import java.util.List;
public class dom4jTest {
public static void main(String[] args) throws Exception {
selectSingleNameXPATH();
}
public static void selectName() throws Exception {
/*
* 得到xml文件所有的name 标签
* 1.创建解析器
* 2.得到document文件
* 3.得到根节点
*
* 4.得到<p1>
* 5.得到<name>
* 6.得到name里面的值
* */
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
Element root = document.getRootElement();
List<Element> list1 = root.elements("p1");
for(Element e1:list1){
List<Element> list2 = e1.elements("name");
for(int i = 0;i < list2.size();++i){
Element name = list2.get(i);
String s = name.getText();
System.out.println(s);
}
}
}
public static void addWeight(int n) throws Exception {
/*
* 在第n个p1标签的末尾添加一个Weight标签
* */
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
Element root = document.getRootElement();
List<Element> list = root.elements("p1");
Element p1 = list.get(n);
Element Weight1 = p1.addElement("Weight"); //addElement 添加标签
Weight1.setText("140"); //setText 设置文本
//回写
OutputFormat format = OutputFormat.createPrettyPrint(); //有缩进的效果
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day04/day04_1.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
}
public static void addAgeBefore() throws Exception {
/*
* 在第一个p1中特定的标签前添加标签(本例在age标签前添加新标签School)
* */
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
//得到p1下所有标签
List<Element> list = p1.elements();
//创建School标签
Element school = DocumentHelper.createElement("School");
//添加文本
school.setText("AHUT");
//特定位置添加
list.add(2,school);
//回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day04/day04_1.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
}
public static void deleteName(int m,int n) throws Exception {
/*
* 删除第m+1个p1下的第n+1个name元素
* */
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
Element root = document.getRootElement();
List<Element> list1 = root.elements("p1");
Element p1 = list1.get(m);
List<Element> list = p1.elements("name");
Element name1 = list.get(n);
p1.remove(name1); //删除节点
//重写xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day04/day04_1.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
}
XPath
由于上述过程比较繁杂,我们引入了XPath写法,与上面不同的是,XPath写法获取元素不需要再使用element
和elements
方法,而使用了selectSingleNode
和selectNodes
方法直接获取。
selectSingleNode
返回Node
selectNodes
返回List<Node>
XPath路径表达式:
实例:
XPath写法代码:
public static void selectNameXPATH() throws Exception {
/*
* 得到xml文件所有的name 标签(XPATH)
* 1.创建解析器
* 2.得到document文件
* 3.通过selectNodes()获得节点
* 4.获取节点的文本
* 5.输出内容
* */
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
List<Node> list = document.selectNodes("//name");
for(Node node:list){
String s = node.getText();
System.out.println(s);
}
}
public static void selectSingleNameXPATH() throws Exception {
/*
* 得到xml文件第一个p1节点的第一个name值
* 1.创建解析器
* 2.得到document文件
* 3.通过selectSingleNode()获得节点
* 4.获取节点的文本
* 5.输出内容
* */
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/day04/day04_1.xml");
Node node = document.selectSingleNode("//p1[@id='aaaa']/name");
String s = node.getText();
System.out.println(s);
}
}