DOM解析是将XML加载为内存中可随机访问的树形节点对象;xml.dom.minidom是Python轻量DOM实现,需注意编码与空白节点处理。
DOM(Document Object Model)不是一种工具或命令,而是浏览器和多数编程语言提供的标准接口规范。它把整个XML文档加载进内存,构建成一棵节点树——每个标签、属性、文本都是一个可操作的 Node 对象。这意味着你不能“流式读取”超大XML,但可以随机访问任意位置、反复修改、再序列化回字符串。
xml.dom.minidom 是Python标准库中最轻量的DOM实现,适合中小XML(Text 节点,容易导致 element.childNodes 返回意外长度。
parse() 加载文件时,确保传入已解码的 BytesIO 或指定 encoding(如 parse("data.xml", parser=expat.ParserCreate('utf-8')))Element 类型:for child in elem.childNodes:
if child.nodeType == child.ELEMENT_NODE:
print(child.tagName)getAttribute("name"),不要直接访问 attributes 字典——它在某些版本里可能为 None
浏览器环境里,DOMParser 解析XML返回的是 XMLDocument,不是 HTMLDocument。这意味着 querySelector 可用,但 innerHTML 不可用,getElementsByName 也不可靠——必须用 getElementsByTagName 或 getElementsByTagNameNS(如果有命名空间)。
DOMParser 不抛异常,而是返回带错误信息的文档:const doc = new DOMParser().parseFromString(xmlStr, "application/xml");
if (doc.querySelector("parsererror")) {
throw new Error("XML parse failed: " + doc.querySelector("parsererror").textContent);
}new XMLSerializer().serializeToString(doc),不能用 doc.documentElement.outerHTML
doc.createElement("tag"),
document.createElement(后者创建的是HTML元素)DOM规范不保证保留原始XML的格式细节。无论你用 minidom.toprettyxml() 还是 XMLSerializer,都可能出现:XML声明重复、空格被抹平、自闭合标签展开成 。如果下游系统严格校验格式,不能依赖DOM原生序列化结果。
minidom 的 toprettyxml(indent=" ", newl="\n") 会为所有节点加缩进,包括文本节点,常导致多余空行lxml.etree(Python)或 XMLSerializer 配合 formatting 选项(部分引擎支持)serializeToString() 也可能重排属性顺序——这在签名验证场景下是硬伤DOM解析真正难的不是怎么调用API,而是意识到它强制全量加载、不支持增量更新、格式保真度差——这些限制在设计阶段就得让业务方确认能否接受。