xml.dom.minidom.parsestring会静默丢弃xml声明和注释,仅返回文档节点树;适用于纯数据提取,不适用于格式保真操作;需手动拼接声明、注意编码输出、避免循环中直接遍历动态nodelist。

parseString 会静默丢弃 XML 声明和注释
它只返回文档节点树,xml.dom.minidom.parseString 不保留 <?xml version="1.0" encoding="utf-8"?> 或 <!-- comment -->。如果你依赖声明里的编码信息或需要原样输出带注释的 XML,别指望它能还原。
常见错误现象:用 parseString 解析后再调用 toxml(),结果编码声明没了、注释没了、空白缩进全乱了。
- 使用场景:适合纯数据提取(如读取配置、解析 API 返回体),不适合 XML 格式保真操作
- 如果必须保留声明,得手动拼接:
"<?xml version='1.0' encoding='utf-8'?>" + xml_str -
toxml()默认用UTF-8编码输出,即使原始字符串声明是GBK,也不会报错,但内容可能乱码
中文字符报 UnicodeEncodeError 的真实原因
不是 parseString 本身出问题,而是你后续调用 toxml() 或 toprettyxml() 时,Python 2 环境下默认用 ASCII 编码写字符串,或者 Python 3 中 stdout 不支持 UTF-8 编码(比如 Windows 控制台)。
典型错误信息:UnicodeEncodeError: 'ascii' codec can't encode character u'\u4f60' in position 0: ordinal not in range(128)
立即学习“Python免费学习笔记(深入)”;
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- Python 3 下最稳写法:
dom.toxml(encoding="utf-8").decode("utf-8")(仅当需 str 类型时) - 直接写文件更安全:
with open("out.xml", "wb") as f: f.write(dom.toxml(encoding="utf-8")) - 避免用
toprettyxml()处理含中文的 DOM——它会在换行处插入空格,导致中文前多出无法显示的控制符
getElementsByTagName 返回的是动态 NodeList,不是 list
它返回的对象行为像“活链接”,不是快照。一旦你修改 DOM(比如删节点、加子节点),同一个 getElementsByTagName("item") 再次遍历时长度或内容可能已变。
容易踩的坑:循环中用 .removeChild() 删除匹配节点,却用 for node in dom.getElementsByTagName("item"): ——会跳过相邻节点,漏删。
- 正确做法:先转成 list:
for node in list(dom.getElementsByTagName("item")): - 注意大小写敏感:
getElementsByTagName("Item")和getElementsByTagName("item")不等价 - 不支持 CSS 选择器或 XPath,查嵌套结构只能靠多层
getElementsByTagName套用或手动遍历childNodes
内存占用高、速度慢,但没替代方案时怎么压一压
xml.dom.minidom 是纯 Python 实现,构建完整 DOM 树,对大文件(>5MB)很容易 OOM 或卡死。但它轻量、标准库自带、调试友好——所以不是“不该用”,而是“得知道边界”。
性能影响明显的情况:解析日志类 XML(字段多、层级浅但条目极多)、CI 脚本里高频调用。
- 能流式处理就别 DOM:改用
xml.sax或xml.etree.ElementTree.iterparse - 临时提速技巧:禁用空白文本节点,减少对象数量:
dom = parseString(xml_str); dom.documentElement.normalize()后再清理node.wholeText为空的Text节点 - 别在循环里反复调用
parseString;如果 XML 结构固定,考虑缓存 DOM 或预编译正则提取关键字段
事情说清了就结束









