xmltodict默认将XML属性转为@key形式,如@id、@category;可通过attr_prefix参数自定义前缀或忽略;含文本和属性的标签用#text键存文本;命名空间和多值属性按原样处理。

xmltodict 默认会把 XML 属性转为以 @ 开头的键名,嵌套在对应元素的字典中。这是它的核心约定,不是 bug,而是设计选择。
属性默认变成 @key 形式
比如这段 XML:
Python Guide
用 xmltodict.parse() 解析后,结果是:
{
"book": {
"@id": "123",
"@category": "fiction",
"title": "Python Guide"
}
}
所有属性都自动加了 @ 前缀,和子元素同级,避免命名冲突。
立即学习“Python免费学习笔记(深入)”;
自定义属性前缀(去掉 @ 或换符号)
通过 attr_prefix 参数可修改前缀:
-
attr_prefix=""→ 属性直接用原名(但可能和子元素名冲突) -
attr_prefix="_"→ 变成_id、_category -
attr_prefix=None→ 属性被忽略(不推荐,除非明确不需要)
示例:
xmltodict.parse(xml_str, attr_prefix="_")
输出中就变成 "_id": "123"。
区分属性和文本内容(#text)
如果一个标签既有属性又有纯文本,xmltodict 会用 #text 键存文本:
29.99
解析后是:
{"price": {"@currency": "USD", "#text": "29.99"}}
注意:#text 是固定键名,不可通过参数更改;若需统一处理,建议解析后手动提取或封装一层转换逻辑。
处理多值属性或命名空间
xmltodict 对命名空间(如 xmlns:xsi)也按属性处理,带 @ 前缀;多值属性(如 class="a b c")不做拆分,原样保留为字符串。
- 如需自动拆分 class 等空格分隔属性,得自己后处理:
elem.get("@class", "").split() - 命名空间较复杂时,建议先用
xml.etree.ElementTree预处理,再转 dict










