使用Java解析XML文件的完整指南
XML(可扩展标记语言)是存储和传输结构化数据的通用格式,在Java开发中,解析XML是常见需求,例如处理配置文件、API响应或数据交换,本文将详细介绍五种主流解析方法,并提供可运行的代码示例。
XML解析的核心方法
Java解析XML主要分为两类模型:
-
DOM(文档对象模型)
一次性加载整个XML到内存,生成树形结构,适合小型文件,支持随机访问。- 优点:直观易用,可修改XML结构
- 缺点:内存占用高
-
SAX/StAX(流式模型)
基于事件驱动,按顺序读取XML节点。
- 优点:内存效率高,适合大文件
- 缺点:只能单向遍历
DOM解析(标准库)
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
public class DOMParser {
public static void main(String[] args) throws Exception {
// 1. 创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2. 防止XXE攻击(安全关键步骤)
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// 3. 解析XML文件
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("data.xml"));
doc.getDocumentElement().normalize(); // 标准化文档
// 4. 遍历节点
NodeList nodeList = doc.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String title = element.getElementsByTagName("title")
.item(0).getTextContent();
System.out.println("书名: " + title);
}
}
}
}
SAX解析(标准库)
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
public class SAXParser extends DefaultHandler {
private boolean isTitle = false;
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
if (qName.equalsIgnoreCase("title")) {
isTitle = true;
}
}
public void characters(char[] ch, int start, int length) {
if (isTitle) {
System.out.println("书名: " + new String(ch, start, length));
isTitle = false;
}
}
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse("data.xml", new SAXParser()); // 事件驱动解析
}
}
JDOM解析(第三方库)
步骤:
-
添加Maven依赖:
<dependency> <groupId>org.jdom</groupId> <artifactId>jdom2</artifactId> <version>2.0.6</version> </dependency>
-
代码实现:

import org.jdom2.*; import org.jdom2.input.SAXBuilder; import java.util.List;
public class JDOMExample {
public static void main(String[] args) throws Exception {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(“data.xml”);
Element root = doc.getRootElement();
List
for (Element book : books) {
String title = book.getChildText("title");
System.out.println("书名: " + title);
}
}
---
#### **五、DOM4J解析(高性能库)**
**步骤:**
1. 添加Maven依赖:
```xml
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
- 代码实现:
import org.dom4j.*; import org.dom4j.io.SAXReader; import java.util.List;
public class DOM4JExample {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document doc = reader.read(“data.xml”);
Element root = doc.getRootElement();

List<Node> nodes = root.selectNodes("//book/title");
for (Node node : nodes) {
System.out.println("书名: " + node.getText());
}
}
---
#### **六、StAX解析(流式高效方案)**
```java
import javax.xml.stream.*;
import java.io.FileReader;
public class StAXExample {
public static void main(String[] args) throws Exception {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(
new FileReader("data.xml")
);
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT
&& reader.getLocalName().equals("title")) {
System.out.println("书名: " + reader.getElementText());
}
}
reader.close();
}
}
方法对比与选型建议
| 方法 | 内存占用 | 速度 | 易用性 | 适用场景 |
|---|---|---|---|---|
| DOM | 高 | 中等 | 小型XML/需修改结构 | |
| SAX | 极低 | 快 | 大型XML/只读操作 | |
| JDOM | 中等 | 中等 | 需要简洁API的项目 | |
| DOM4J | 中等 | 快 | 高性能需求/复杂XPath | |
| StAX | 低 | 极快 | 流式处理/超大文件 |
安全提示:所有解析器均应关闭外部实体(XXE防护):
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
最佳实践总结
- 小型配置:优先使用DOM或JDOM,代码简洁
- 日志/大数据:选择SAX或StAX避免内存溢出
- 现代项目:推荐DOM4J(平衡性能与功能)
- 安全第一:始终禁用DTD和外部实体
- 异常处理:捕获
ParserConfigurationException、SAXException、IOException
<!-- 示例XML结构(data.xml) -->
<library>
<book>Java核心技术</title>
<author>Cay S. Horstmann</author>
</book>
<book>Effective Java</title>
<author>Joshua Bloch</author>
</book>
</library>
引用说明:
- Oracle官方文档:Java XML APIs
- DOM4J官网:dom4j
- OWASP XXE防护指南:XXE Prevention
- JDOM官方指南:jdom.org
