7.2 编程库:四大语言的XML选型


7.2 编程库:四大语言的 XML 选型

选 XML 库的统一框架就一句话:先按 5.1 的解析路线选模型,再按 6.1 的安全清单拧阀门。本节把 Java、Python、JavaScript、C# 四大生态的常用库对号入座,每个语言给一段可跑的最小示例,最后给一张横向决策表。

Java:路线最全

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编程艺术

Python:标准库有雷,defusedxml 是默认答案

标准库的 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 与更快的解析,处理大文件或复杂表达式时升级到它。

JavaScript:浏览器与 Node 各有原住民

浏览器端有 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编程艺术"] }

C#:System.Xml 一条龙

.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 章的工序,跑通即加工链闭环。

本节要点回顾

  • 选库三步:访问模式定模型、选库、补安全配置并测试;
  • Python 标准库默认不禁实体,defusedxml 是默认入口;
  • 浏览器 DOMParser 的错误进 parsererror 元素,解析后必查;
  • .NET 的 XmlReader 是 StAX 拉取模型在本生态的对应物;
  • 四生态能力对等,工程差异在默认值与 API 手感。

工具箱收齐,加工链闭环。回头看,这份教程从解剖台的第一刀走到加工流水线的最后一站——愿你手里的每份 XML 文档,都能被稳稳地拆解、检验、转换与查询。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U