在Java开发中,处理xml格式的数据是非常常见的场景,dom4j是一款性能优异、使用便捷的xml解析工具,能够高效处理xml字符串的解析需求。下面详细介绍使用dom4j解析xml字符串的具体实现方法。

环境准备
首先需要在项目中引入dom4j的依赖,如果是Maven项目,在pom.xml中添加如下依赖配置:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
如果是普通Java项目,可以下载dom4j的jar包手动导入到项目的类路径中。
基础解析步骤
使用dom4j解析xml字符串的核心流程分为三步:将字符串转换为Document对象、获取根节点、遍历解析子节点内容。下面是完整的示例代码:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.List;
public class Dom4jParseDemo {
public static void main(String[] args) {
// 待解析的xml字符串
String xmlStr = "<user><id>1001</id><name>张三</name><age>25</age><hobby>篮球</hobby><hobby>阅读</hobby></user>";
try {
// 1. 创建SAXReader对象
SAXReader reader = new SAXReader();
// 2. 将xml字符串转换为Document对象
Document document = reader.read(new StringReader(xmlStr));
// 3. 获取根节点
Element rootElement = document.getRootElement();
System.out.println("根节点名称:" + rootElement.getName());
// 4. 解析根节点下的子元素
Element idElement = rootElement.element("id");
System.out.println("用户id:" + idElement.getText());
Element nameElement = rootElement.element("name");
System.out.println("用户姓名:" + nameElement.getText());
Element ageElement = rootElement.element("age");
System.out.println("用户年龄:" + ageElement.getText());
// 5. 解析多个同名子节点
List<Element> hobbyElements = rootElement.elements("hobby");
System.out.println("用户爱好:");
for (Element hobby : hobbyElements) {
System.out.println(" " + hobby.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
核心API说明
上述代码中用到的dom4j核心API作用如下:
SAXReader:用于读取xml数据并生成Document对象的解析器类Document:表示整个xml文档的对象,是解析的入口Element:表示xml中的节点元素,包含节点的名称、属性、文本内容、子节点等信息element(String name):获取当前节点下指定名称的第一个子节点elements(String name):获取当前节点下指定名称的所有子节点,返回List集合getText():获取当前节点的文本内容
常见场景处理
解析带属性的xml字符串
如果xml节点包含属性,可以通过attributeValue(String name)方法获取属性值,示例xml和代码如下:
// 带属性的xml字符串
String attrXmlStr = "<book id="b001" category="编程"><title>Java核心技术</title><price>89.9</price></book>";
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(attrXmlStr));
Element root = document.getRootElement();
// 获取节点属性
String bookId = root.attributeValue("id");
String category = root.attributeValue("category");
System.out.println("图书id:" + bookId + ",分类:" + category);
// 获取子节点内容
String title = root.element("title").getText();
String price = root.element("price").getText();
System.out.println("书名:" + title + ",价格:" + price);
} catch (DocumentException e) {
e.printStackTrace();
}
处理xml命名空间
如果xml字符串包含命名空间,需要在解析时设置命名空间感知,示例代码如下:
String nsXmlStr = "<ns:user xmlns:ns="http://www.ippipp.com/user"><ns:name>李四</ns:name><ns:age>30</ns:age></ns:user>";
try {
SAXReader reader = new SAXReader();
// 开启命名空间支持
reader.setFeature("http://xml.org/sax/features/namespaces", true);
Document document = reader.read(new StringReader(nsXmlStr));
Element root = document.getRootElement();
// 获取带命名空间的子节点,需要传入完整的节点名(包含命名空间前缀)
Element nameElement = root.element("ns:name");
System.out.println("用户名:" + nameElement.getText());
} catch (Exception e) {
e.printStackTrace();
}
注意事项
- 解析xml字符串时需要处理
DocumentException异常,避免xml格式错误导致程序崩溃 - 如果xml字符串内容过大,建议使用流式解析避免内存溢出,dom4j的SAXReader本身就是基于SAX流式解析实现的,适合处理较大的xml数据
- 获取子节点前可以先判断节点是否存在,避免空指针异常,比如使用
root.element("name") != null做前置校验