XML解析基础与常用技巧
一、XML基础概念
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,具有以下特点:
- 自描述性:标签可自定义
- 层次结构:树形数据组织形式
- 平台无关:纯文本格式
- 广泛支持:多种编程语言都有解析库
二、XML解析方法
1. DOM解析(文档对象模型)
- 将整个XML文档加载到内存形成树结构
- 优点:可随机访问节点,支持修改
- 缺点:内存消耗大,不适合大文件
// Java DOM解析示例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("data.xml");
NodeList nodeList = doc.getElementsByTagName("book");
2. SAX解析(简单API for XML)
- 基于事件驱动的流式解析
- 优点:内存效率高,适合大文件
- 缺点:不能随机访问,只能顺序读取
// Java SAX解析示例
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
public void startElement(...) { /* 处理开始标签 */ }
public void characters(...) { /* 处理文本内容 */ }
};
saxParser.parse("data.xml", handler);
3. StAX解析(流API for XML)
- 介于DOM和SAX之间,推拉结合模型
- 优点:可以控制解析过程,内存效率较高
// Java StAX解析示例
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("data.xml"));
while(reader.hasNext()) {
int event = reader.next();
if(event == XMLStreamConstants.START_ELEMENT) {
String elementName = reader.getLocalName();
}
}
三、常用解析技巧
1. 命名空间处理
// 启用命名空间感知
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
// XPath中使用命名空间
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContext() {
public String getNamespaceURI(String prefix) {
return "http://example.com/ns";
}
});
2. XPath快速查询
// 使用XPath查询节点
XPathExpression expr = xpath.compile("//book[price>35]/title");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
3. 属性处理
// 获取元素属性
Element element = (Element)node;
String id = element.getAttribute("id");
// 设置属性
element.setAttribute("category", "fiction");
4. 错误处理
// 设置验证
factory.setValidating(true);
// 自定义错误处理器
builder.setErrorHandler(new ErrorHandler() {
public void warning(SAXParseException e) {...}
public void error(SAXParseException e) {...}
public void fatalError(SAXParseException e) {...}
});
5. 性能优化技巧
- 对大文件使用SAX或StAX
- 缓存XPath编译结果
- 重用解析器实例
- 关闭不必要的验证功能
四、常见问题解决
-
编码问题:确保XML声明中指定正确编码(如
<?xml version="1.0" encoding="UTF-8"?>
) -
特殊字符处理:使用CDATA节或实体引用处理特殊字符
<description><![CDATA[特殊内容&<>"']]></description>
-
空白节点处理:使用
setIgnoringElementContentWhitespace(true)
忽略空白文本节点 -
内存泄漏:及时关闭XMLStreamReader等资源
五、各语言推荐库
- Java: DOM/SAX/StAX(JAXP), JDOM, DOM4J
- Python: xml.etree.ElementTree, lxml
- JavaScript: DOMParser, xml2js
- C#: System.Xml, LINQ to XML
掌握这些基础知识和技巧后,您将能够高效地处理各种XML数据解析需求。