dicttoxml是最省事的xml转换方案,但需注意中文编码、none值处理及特殊字符转义;手动用xml.etree.elementtree更可控,适合复杂逻辑或结构不规整场景。

用 dicttoxml 是最省事的方案,但得小心中文和嵌套空值
直接装 dicttoxml 库就能转,不用自己拼字符串或写递归。它把 dict 当树来遍历,自动生成带层级的 XML 标签。
常见错误是传入含 None 的字段——默认会生成空标签如 <field></field>,但有些下游系统(比如老版本 Java 解析器)会把它当缺失字段处理;还有中文 key 或 value 不加 custom_root 和 encoding 参数时,容易在 XML 声明里漏掉 encoding="utf-8",导致解析乱码。
- 安装:运行
pip install dicttoxml - 基础用法:
dicttoxml.dicttoxml(data, custom_root='root', encoding='utf-8'),custom_root必填,否则根节点叫items,不符合多数接口预期 - 遇到
None值,加参数attr_type=False可禁用类型属性(避免生成type="null"),再配合ignore_none=True直接跳过该字段 - 如果字典里有 list,它会自动为每个元素生成同名子节点,比如
"users": [{"name": "a"}, {"name": "b"}]→ 两个<users><name>a</name></users>,注意这不是标准数组表示法,只是扁平展开
xml.etree.ElementTree 手动构建更可控,适合字段逻辑复杂或需校验
当你的字典结构不规整(比如混合了要忽略的字段、需要重命名 key、或某些 value 要转成属性而非子节点),硬套 dicttoxml 容易绕弯。这时候用标准库 xml.etree.ElementTree 一行行建节点,反而快且不易出错。
典型坑是忘记调用 ET.tostring(..., encoding='utf-8'),直接 print 出来是 bytes 类型,还带 b'' 前缀;或者没设 method='xml' 导致换行缩进异常,影响可读性。
立即学习“Python免费学习笔记(深入)”;
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 根节点必须显式创建:
root = ET.Element('root'),不能靠函数自动推导 - 给节点加属性用
elem.set('attr_name', 'value'),别写成elem.attrib['attr_name'] = 'value'—— 后者虽能运行,但部分解析器对 attrib 字典顺序敏感,set 更稳妥 - text 内容必须是字符串,数字或 bool 要先
str(),否则抛TypeError: expected string or bytes-like object - 如果数据含 CDATA,
ElementTree不原生支持,得手动拼字符串再替换,不如换lxml
遇到特殊字符(& " ')必须转义,否则 XML 解析直接失败
XML 对这五个字符有严格要求:&、、<code>>、"、'。Python 默认不帮你转——哪怕你用 dicttoxml 或 ElementTree,只要原始 dict 里的字符串含未转义的 & 或 ,生成的 XML 就是非法的,下游一解析就报 <code>ParseError: not well-formed。
别指望“我只传纯文本,不会有这些”,URL、日志片段、用户输入、甚至 SQL 片段都可能混进来。最稳妥是在塞进 XML 前统一过一遍 html.escape()。
-
from html import escape,然后对所有可能含 HTML/XML 特殊字符的 value 做escape(str(value)) - 不要用正则替换,
escape()处理边界情况更全(比如&不会变成&) - 如果 value 本身就是合法 XML 片段(比如想内嵌一段
<p>Hello</p>),那就不能用escape(),得走 CDATA 或换lxml的etree.fromstring()注入
小数据用标准库,大数据量或需 XSLT/Schema 验证时,换 lxml
xml.etree.ElementTree 在 Python 3.9+ 性能已不错,但如果你要验证 XML 是否符合某个 XSD、做 XSLT 转换、或处理上百 MB 的 dict 输出,它就力不从心了。lxml 是 C 实现,快得多,API 也更贴近 DOM 规范。
容易被忽略的是命名空间处理:用 ElementTree 写 {http://ns}tag 很别扭,而 lxml 支持 nsmap 参数一键声明,生成带前缀的 XML 更干净。
- 安装:
pip install lxml(Windows 用户注意可能需要预编译 wheel) - 创建带命名空间的根:
root = etree.Element('root', nsmap={None: 'http://my.ns', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}) - 验证 XSD:
schema = etree.XMLSchema(etree.parse('schema.xsd')),然后schema.validate(tree) - 性能差异明显:10 万级嵌套 dict,
lxml构建耗时通常比ElementTree低 30%–50%
json.dumps(data, indent=2, default=str) 看一眼原始结构,心里有底再动手。









