Java解析XML的方式有很多种,不同的解析方式在性能、内存占用、使用复杂度上都有差异,开发者可以根据实际需求选择合适的解析方案。下面汇总了几种常用的Java解析XML的示例代码。

DOM解析XML示例
DOM解析会将整个XML文档加载到内存中,形成一棵DOM树,方便对节点进行增删改查操作,适合处理较小的XML文件。
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class DomParseXmlDemo {
public static void main(String[] args) {
try {
// 创建DocumentBuilderFactory实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文件得到Document对象
Document document = builder.parse(new File("test.xml"));
// 获取根节点
Element root = document.getDocumentElement();
System.out.println("根节点名称:" + root.getNodeName());
// 获取所有user节点
NodeList userNodes = root.getElementsByTagName("user");
for (int i = 0; i < userNodes.getLength(); i++) {
Element userElement = (Element) userNodes.item(i);
// 获取id属性
String id = userElement.getAttribute("id");
// 获取name子节点内容
String name = userElement.getElementsByTagName("name").item(0).getTextContent();
// 获取age子节点内容
String age = userElement.getElementsByTagName("age").item(0).getTextContent();
System.out.println("用户id:" + id + ",姓名:" + name + ",年龄:" + age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
对应的test.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
</user>
</users>
SAX解析XML示例
SAX解析是事件驱动的解析方式,不会将整个XML文档加载到内存中,适合处理大型XML文件,内存占用低,但只能顺序读取,不能修改节点内容。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class SaxParseXmlDemo {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
// 创建自定义的处理器
DefaultHandler handler = new DefaultHandler() {
// 当前解析的节点名称
private String currentNodeName = "";
// 用户id
private String userId = "";
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentNodeName = qName;
if ("user".equals(qName)) {
// 获取user节点的id属性
userId = attributes.getValue("id");
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length).trim();
if (!content.isEmpty()) {
if ("name".equals(currentNodeName)) {
System.out.println("用户id:" + userId + ",姓名:" + content);
} else if ("age".equals(currentNodeName)) {
System.out.println("用户id:" + userId + ",年龄:" + content);
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
currentNodeName = "";
}
};
// 解析XML文件
saxParser.parse(new File("test.xml"), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
dom4j解析XML示例
dom4j是第三方开源的XML解析框架,使用简单,功能强大,支持DOM和SAX两种解析模式,是很多Java项目常用的XML解析工具,使用前需要导入dom4j的依赖包。
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class Dom4jParseXmlDemo {
public static void main(String[] args) {
try {
// 创建SAXReader实例
SAXReader reader = new SAXReader();
// 读取XML文件得到Document对象
Document document = reader.read(new File("test.xml"));
// 获取根节点
Element root = document.getRootElement();
System.out.println("根节点名称:" + root.getName());
// 获取所有user子节点
List<Element> userElements = root.elements("user");
for (Element userElement : userElements) {
// 获取id属性
String id = userElement.attributeValue("id");
// 获取name子节点内容
String name = userElement.elementText("name");
// 获取age子节点内容
String age = userElement.elementText("age");
System.out.println("用户id:" + id + ",姓名:" + name + ",年龄:" + age);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
不同解析方式对比
三种常用的XML解析方式各有特点,开发者可以根据实际场景选择:
| 解析方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| DOM解析 | 可以随机访问节点,支持增删改查操作 | 内存占用高,不适合大文件 | 小体积XML文件,需要修改节点内容 |
| SAX解析 | 内存占用低,解析速度快 | 只能顺序读取,不支持修改操作 | 大体积XML文件,只需要读取数据 |
| dom4j解析 | API简单易用,功能丰富,性能较好 | 需要引入第三方依赖 | 大多数常规XML解析场景 |