Java使用dom4j解析XML
作者:山风wind
Java解析XML dom4j 简单易上手
在Java中使用dom4j库解析XML是一种常见的方法。dom4j是一个开源的、基于Java的XML解析库,它结合了DOM(文档对象模型)、SAX(简单API for XML)和事件驱动的优点,使得处理XML更加容易。
Maven项目添加依赖
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
XML示例文件
文件保存在项目resource目录下:
<root>
<name length="4" isFrom="true">张三</name>
<age length="2" isFrom="false">99</age>
<address length="5" region="中国">陕西</address>
<hobbies>
<hobby price="100">足球</hobby>
<hobby price="10">篮球</hobby>
<hobby price="100">排球</hobby>
</hobbies>
</root>
dom4j 操作xml文件
文件从resouce目录下获取到:
/**
* 读取XML文件并打印其结构和内容。
* @throws DocumentException 如果解析XML文件时发生错误
*/
private static void parseXmlGetInfo() throws DocumentException {
// 创建一个SAXReader对象用于读取XML文档
SAXReader reader = new SAXReader();
// 读取XML文件 加载XML文档 你可以从文件、字符串或输入流加载XML文档。
Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml"));
// 获取根元素 一旦你有了Document对象,就可以通过它来访问XML文档的内容
Element root = document.getRootElement();
// 打印根元素的名称
System.out.println("根元素名称:" + root.getName());
// 遍历根元素的所有子元素
for (Element child : root.elements()) {
if (child.elements().isEmpty()) {
// 如果子元素没有子元素,则打印子元素的信息
System.out.println("-------------------------------------------");
System.out.println("---子元素名称:" + child.getName());
System.out.println("---子元素文本:" + child.getText());
// 打印子元素的属性值
System.out.println("---子元素属性 length:" + child.attributeValue("length"));
System.out.println("---子元素属性 isForm:" + child.attributeValue("isForm"));
System.out.println("---子元素属性 region:" + child.attributeValue("region"));
System.out.println("-------------------------------------------");
} else {
// 如果子元素有子元素,则遍历并打印孙元素的信息
for (Element grandChild : child.elements()) {
System.out.println("-------------------------------------------");
System.out.println("------孙元素名称:" + grandChild.getName());
System.out.println("------孙元素文本:" + grandChild.getText());
System.out.println("-------------------------------------------");
}
}
}
}
结果:

处理XML文档中的文本转换
处理XML文档中的文本转换通常涉及到将文本从一种格式或编码转换为另一种。在使用dom4j进行Java编程时,可以采取以下几种方法来处理这些转换:
1. 文本编码转换
需要改变XML文件的编码方式(例如从UTF-8转换为ISO-8859-1),可以在读取和写入XML文档时指定编码。
读取时指定编码
InputStream inputStream = new FileInputStream("xmlfile.xml");
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8"); // 指定编码
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(reader);
写入时指定编码
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 设置输出编码
XMLWriter writer = new XMLWriter(new FileOutputStream("path/to/output.xml"), format);
writer.write(document);
writer.close();
2. 特殊字符转义
在XML中,某些字符如 <, >, &, " 和 ’ 需要被转义以避免语法错误。dom4j会自动处理这些特殊字符的转义。
3. 处理CDATA
如果文本包含不应该被解析器解释的字符序列,可以放入CDATA段落中。dom4j也支持创建和处理CDATA部分。
Element cdataElement = root.addElement("cdataElement");
CDATA cdata = new CDATA("<b>This is bold text</b>");
cdataElement.add(cdata);
解析String类型的XML
获取到Document对象之后,其他操作相同。
/**
* 读取XML文件并将其内容解析为字符串,然后打印出来。
* @throws Exception 如果读取或解析过程中发生错误
*/
public static void parseXmlString() throws Exception {
// 获取资源文件的输入流
InputStream inputStream = parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml");
if (inputStream == null) {
// 如果资源文件未找到,抛出IOException
throw new IOException("Resource not found");
}
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
// 逐行读取输入流的内容并追加到StringBuilder中
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
} catch (IOException e) {
// 捕获并重新抛出IOException
throw new RuntimeException(e);
}
// 打印XML内容
System.out.println(stringBuilder);
// 将字符串解析为Document对象
Document document = DocumentHelper.parseText(stringBuilder.toString());
}
使用Xpath通过制定位置定位到XML中的节点元素
maven引入依赖jaxen
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
XPath的语法
绝对路径表示方式:
以/开头的路径表示绝对路径,绝对路径是从根元素开始写。例如 /元素/子元素/子子元素……;
相对路径的表达方式:
相对于当前节点的元素继续查找的节点,不以/开头,…/表示上一个元素,./表示当前元素;
全文搜索路径方式:
例如//子元素,//子元素//子子元素,//子元素/子子元素。
注意:
表示无论中间有多少层,直接获取所有子元素所有满足条件的元素
表示只找一层
谓语(条件筛选形式)
例如 : //元素[@attr1=value]
/**
* 使用XPath表达式从XML文件中选择节点并打印相关信息。
* @throws DocumentException 如果解析XML文件时发生错误
*/
private static void useXpath() throws DocumentException {
// 创建一个SAXReader对象用于读取XML文档
SAXReader reader = new SAXReader();
// 读取XML文件
Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml"));
// 使用XPath表达式获取指定节点
Element element = (Element) document.selectSingleNode("root/name");
// 打印节点的文本内容
System.out.println(element.getText());
// 指定路径获取所有hobby节点
List<Node> nodes = document.selectNodes("root/hobbies/hobby");
for (Node node : nodes) {
// 打印每个hobby节点的文本内容
System.out.println(node.getText());
}
System.out.println("------------------");
// 使用通配符获取所有hobby节点
List<Node> nodeList = document.selectNodes("//hobby");
for (Node node : nodeList) {
// 打印每个hobby节点的文本内容
System.out.println(node.getText());
}
System.out.println("------------------");
// 使用XPath表达式获取具有特定属性的节点
Element idElement = (Element) document.selectSingleNode("//hobby[@price='10']");
// 打印节点的文本内容
System.out.println(idElement.getText());
}
结果:

总结
使用dom4j结合XPath解析XML提供了一种强大而灵活的方式来查询和操作XML数据。XPath表达式的简洁性和灵活性使得即使对于结构复杂的XML文档,也能够快速准确地定位所需的数据。同时,dom4j提供了简单易用的API,方便开发者进行各种XML相关的操作。
到此这篇关于Java使用dom4j解析XML的文章就介绍到这了,更多相关Java dom4j解析XML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
