选 XML 库的统一框架就一句话:先按 5.1 的解析路线选模型,再按 6.1 的安全清单拧阀门。本节把 Java、Python、JavaScript、C# 四大生态的常用库对号入座,每个语言给一段可跑的最小示例,最后给一张横向决策表。
Java 标准库自带三条路线:javax.xml.parsers(DOM/SAX)、javax.xml.stream(StAX),外加支持 XPath 的 javax.xml.xpath。第三方里 JDOM 与 dom4j 用更顺手的 API 包装 DOM。最小示例(DOM + XPath,5.1 与 5.3 的合体):
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 安全阀门在工厂上配——先拧阀门再建解析器(6.1 节清单) Document doc = f.newDocumentBuilder().parse(orderStream); NodeList low = (NodeList) XPathFactory.newInstance().newXPath() .evaluate("//book[stock < 10]/title", doc, XPathConstants.NODESET); for (int i = 0; i < low.getLength(); i++) System.out.println(low.item(i).getTextContent()); // 输出:JavaScript DOM编程艺术
标准库的 xml.etree.ElementTree 是内存树模型(DOM 同类),xml.sax 提供 SAX。但标准库默认不禁实体扩展——6.1 节已建议用 defusedxml 替换入口。最小示例:
from defusedxml import ElementTree as ET # 安全封装,API 与 ElementTree 一致 tree = ET.parse("inventory.xml") for book in tree.getroot().iter("book"): if int(book.find("stock").text) < 10: print(book.find("title").text) # 输出:JavaScript DOM编程艺术
iter 遍历近似 //book 的效果;lxml 库则提供完整 XPath 1.0 与更快的解析,处理大文件或复杂表达式时升级到它。
浏览器端有 DOMParser,解析结果直接用网页 DOM API 操作;Node 端常用 fast-xml-parser(轻量、流式友好)或 xmldom。示例(浏览器端):
const doc = new DOMParser().parseFromString(xmlText, "application/xml"); // 良构错误会进 parsererror 元素而非抛异常——解析后先查它 const err = doc.querySelector("parsererror"); if (!err) { const titles = [...doc.querySelectorAll("book")] .filter(b => +b.querySelector("stock").textContent < 10) .map(b => b.querySelector("title").textContent); console.log(titles); // ["JavaScript DOM编程艺术"] }
.NET 的 System.Xml 命名空间覆盖 XmlDocument(DOM)、XmlReader(StAX 式拉取)、XPathNavigator(XPath)。示例(XmlReader 流式版):
using var r = XmlReader.Create("inventory.xml"); r.DtdProcessing = DtdProcessing.Ignore; // 安全阀门:忽略 DTD while (r.Read()) { if (r.NodeType == XmlNodeType.Element && r.Name == "stock") { r.Read(); if (int.Parse(r.Value) < 10) Console.WriteLine("低库存条目"); } } // 流式单遍:5.1 节 StAX 路线在 .NET 的对应物
| 诉求 | Java | Python | JavaScript | C# |
|---|---|---|---|---|
| DOM 树 | 标准库 DOM | ElementTree | DOMParser | XmlDocument |
| 流式 | StAX | iterparse | 流式解析库 | XmlReader |
| XPath | javax.xml.xpath | lxml | 库自带/原生 | XPathNavigator |
| 安全默认 | 需手工配置 | defusedxml 顶上 | 查库默认 | DtdProcessing 显式设 |
四行共性比差异更重要:每个生态都齐备三条路线,差别只在 API 风格与安全默认值。所以选库流程固定为三步:确定访问模式(回看/单遍/中途决策)→ 选对应模型的库 → 补安全配置并写一条"解析不可信文件"的测试用例(用 6.1 的炸弹文档跑一次,确认拒绝)。
💡 毕业检查:合上这本教程前,任选一门语言,把"解析 → 校验 → XPath 取数 → 输出"四步串成一个能跑的小程序——四步分别对应第 5、3、5、2 章的工序,跑通即加工链闭环。
工具箱收齐,加工链闭环。回头看,这份教程从解剖台的第一刀走到加工流水线的最后一站——愿你手里的每份 XML 文档,都能被稳稳地拆解、检验、转换与查询。