1、导入依赖
<!--解析xml文件依赖-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!--dom4j集成XPath--XPth可以使用路径表达式来选取XML文档中的元素或者属性节点,节点是沿着路径来选取的。-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
2、步骤解析
使用dom4j解析user.xml
步骤
1.创建解析器对象
2.使用解析器对象读取XML文档生成Document对象
3.根据Document对象获取XML的元素(标签)信息
3、常用方法
getQName() | 元素的QName对象 |
getNamespace() | 元素所属的Namespace对象 |
getNamespacePrefix() | 元素所属的Namespace对象的prefix |
getNamespaceURI() | 元素所属的Namespace对象的URI |
getName() | 元素的local name |
getQualifiedName() | 元素的qualified name |
getText() | 元素所含有的text内容,如果内容为空则返回一个空字符串而不是null |
getTextTrim() | 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null |
attributeIterator() | 元素属性的iterator,其中每个元素都是Attribute对象 |
attributeValue() | 元素的某个指定属性所含的值 |
elementIterator() | 元素的子元素的iterator,其中每个元素都是Element对象 |
element() | 元素的某个指定(qualified name或者local name)的子元素 |
elementText() | 元素的某个指定(qualified name或者local name)的子元素中的text信息 |
getParent | 元素的父元素 |
getPath() | 元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用"/"分隔 |
isTextOnly() | 是否该元素只含有text或是空元素 |
isRootElement() | 是否该元素是XML树的根节点 |
4、举例
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="TB10001" country="chinese">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
<user id="TB10002" country="chinese">
<id>10002</id>
<name>tony</name>
<password>666666</password>
</user>
</users>
public class Dom4jParseUserXmlTest {
public static void main(String[] args) {
//1.创建解析器对象
SAXReader saxReader = new SAXReader();
//2.使用解析器对象读取XML文档生成Document对象
try {
Document read = saxReader.read(
Dom4jParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
//3.根据Document对象获取XML的元素(标签)信息
Element rootElement = read.getRootElement();
System.out.println("1.user.xml文件根节点的名字" + rootElement.getName());
System.out.println("2.获取users的子标签列表");
List<Element> usersSubElements = rootElement.elements();
for (Element userElement : usersSubElements) {
System.out.println("users标签的子标签的名字是:"+userElement.getName());
System.out.println("users标签的子标签的id属性值:"+userElement.attributeValue("id"));
System.out.println("users标签的子标签的country属性值:"+userElement.attributeValue("country"));
System.out.println("3.获取user的子标签列表");
List<Element> UserSubElements = userElement.elements();
for (Element userSubElement : UserSubElements) {
System.out.println("user标签的子标签:"+userSubElement.getName());
System.out.println("user标签的子标签的文本是:"+userSubElement.getText());
}
}
//获取users标签的第一个user标签
Element firstUserElement = rootElement.element("user");
//第一个user标签的子标签password的文本
String password = firstUserElement.elementText("password");
System.out.println("第一个user标签的子标签password的文本:"+password);
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
5、使用xpath优化(依赖已经导入)
学习地址:XPath 教程 (w3school.com.cn)
XPath的语法
绝对路径方式,以/开头的路径表示绝对路径,绝对路径是从根元素开始写。例如/元素/子元素/子子元素…
相对路径方式:相对于当前节点的元素继续查找的节点,不以/开头,/表示上一个元素,/表示当前元素全文搜索路径方式:例如//子元素,//子元素//子子元素,子元素//子子元素
//表示无论中间有多少层,直接获取所有子元素所有满足条件的元素
/表示只找一层谓语(条件筛选)方式例如/元素[@attr1=value’]
package dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
public class Dom4jXPathParseUserXmlTest {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
Document document =
saxReader.read(Dom4jXPathParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
//第一个用户的密码
System.out.println("1.使用绝对路径方式查找元素");
Node element = document.selectSingleNode("/users/user/password");
String password = element.getText();
System.out.println("第一个用户的密码:"+password);
System.out.println("2.使用相对路劲查找元素");
Node salaryElement = element.selectSingleNode("../salary");
String salary = salaryElement.getText();
System.out.println("第一个用户的薪水区间:" + salary);
System.out.println("3.使用全文搜索的方式");
System.out.println("获取所有ID元素的文本");
List<Node> idNodeList = document.selectNodes("//id");
for (Node node : idNodeList) {
Element idElement = (Element) node;
System.out.println(idElement.getText());
}
//4.谓语(条件筛选)方式例如/元素[@attr1=value']
Element TB10001idElement = (Element) document.selectSingleNode("//user[@id='TB10001']");
List<Element> elementList = TB10001idElement.elements();
for (Element userSubElement : elementList) {
userSubElement.setName("idss");
System.out.println("user标签的子标签的名字是:"+userSubElement.getName());
System.out.println("user子标签的文本:"+userSubElement.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}