XML作为常用的配置文件格式,在各类项目中都有广泛应用,解析XML配置文件的核心是从XML文档中提取需要的节点数据、属性信息,不同的解析方式在性能、内存占用、操作复杂度上存在差异,开发者可以根据项目需求选择合适的解析方案。

常用XML解析方式对比
目前主流的XML解析方式主要分为四类,各自的特性如下:
| 解析方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| DOM解析 | 树形结构存储,可随机访问节点,操作方便 | 需要将整个文档加载到内存,大文件内存占用高 | 小体积XML配置文件,需要频繁修改节点内容 |
| SAX解析 | 事件驱动,逐行读取,内存占用低 | 只能顺序读取,无法修改节点,开发复杂度高 | 大体积XML文件,只需要读取数据不需要修改 |
| JDOM解析 | API简单易用,专为Java设计 | 性能略低于DOM,依赖第三方库 | 常规Java项目,追求开发效率 |
| DOM4J解析 | 性能优异,功能丰富,支持XPath | 同样依赖第三方库 | 各类Java项目,尤其是需要复杂查询的场景 |
DOM解析XML配置文件示例
DOM解析会将整个XML文档加载为树形结构,方便获取各个节点信息,首先准备一个测试用的XML配置文件config.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<database>
<property name="url">jdbc:mysql://127.0.0.1:3306/test</property>
<property name="username">root</property>
<property name="password">123456</property>
<property name="maxActive">20</property>
</database>
<app>
<property name="name">测试应用</property>
<property name="version">1.0.0</property>
</app>
</config>
接下来使用Java自带的DOM解析器读取该配置文件的内容:
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class DomParseDemo {
public static void main(String[] args) {
try {
// 创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 加载XML配置文件,生成Document对象
Document document = builder.parse(new File("config.xml"));
// 获取根节点
Node root = document.getDocumentElement();
System.out.println("根节点名称:" + root.getNodeName());
// 获取database节点下的所有property子节点
NodeList dbNodes = document.getElementsByTagName("property");
System.out.println("database模块配置项:");
for (int i = 0; i < 4; i++) {
Node node = dbNodes.item(i);
// 获取节点的name属性
String attr = node.getAttributes().getNamedItem("name").getNodeValue();
// 获取节点的文本内容
String value = node.getTextContent();
System.out.println(attr + ":" + value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SAX解析XML配置文件示例
SAX解析基于事件驱动,不需要加载整个文档到内存,适合处理大文件,同样使用上面的config.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 SaxParseDemo {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
// 自定义处理器,处理解析过程中的事件
DefaultHandler handler = new DefaultHandler() {
// 当前解析的节点名称
private String currentNodeName;
// 是否处于database节点的子节点中
private boolean inDatabase = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentNodeName = qName;
if ("database".equals(qName)) {
inDatabase = true;
System.out.println("开始解析database模块配置");
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 只处理database模块下的property节点的内容
if (inDatabase && "property".equals(currentNodeName)) {
String content = new String(ch, start, length).trim();
if (content.length() > 0) {
System.out.println("配置值:" + content);
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("database".equals(qName)) {
inDatabase = false;
System.out.println("database模块解析完成");
}
}
};
parser.parse(new File("config.xml"), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
DOM4J解析XML配置文件示例
DOM4J是实际开发中使用较多的解析库,性能和易用性都比较好,首先需要在项目中引入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 Dom4jParseDemo {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
// 读取XML文件生成Document对象
Document document = reader.read(new File("config.xml"));
// 获取根元素
Element root = document.getRootElement();
// 获取app节点
Element appElement = root.element("app");
// 获取app节点下的所有property子元素
List<Element> properties = appElement.elements("property");
System.out.println("应用配置信息:");
for (Element property : properties) {
// 获取name属性
String name = property.attributeValue("name");
// 获取元素文本内容
String value = property.getText();
System.out.println(name + ":" + value);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
解析过程中的注意事项
- 解析前需要确认XML文件的编码和解析器使用的编码一致,避免出现乱码问题
- 处理大体积XML文件时优先选择SAX或者DOM4J的流式解析方式,避免内存溢出
- 读取节点属性或者文本内容时做好空值判断,防止XML结构变更导致的空指针异常
- 如果项目中需要频繁查询XML中的特定节点,可以使用XPath语法简化查询逻辑,DOM4J对XPath有良好的支持
XMLXML_parsing配置文件解析DOMSAX修改时间:2026-06-18 12:33:52