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"
}
}
所有属性都自动加了 @ 前缀,和子元素同级,避免命名冲突。
通过 attr_prefix 参数可修改前缀:
attr_prefix="" → 属性直接用原名(但可能和子元素名冲突)attr_prefix="_" → 变成 _id、_category
attr_prefix=None → 属性被忽略(不推荐,除非明确不需要)示例:
xmltodict.parse(xml_str, attr_prefix="_")
输出中就变成 "_id": "123"。
如果一个标签既有属性又有纯文本,xmltodict 会用 #text 键存文本:
29.99
解析后是:
{"price": {"@currency": "USD", "#text": "29.99"}}
注意:#text 是固定键名,不可通过参数更改;若需统一处理,建议解析后手动提取
或封装一层转换逻辑。
xmltodict 对命名空间(如 xmlns:xsi)也按属性处理,带 @ 前缀;多值属性(如 class="a b c")不做拆分,原样保留为字符串。
elem.get("@class", "").split()
xml.etree.ElementTree 预处理,再转 dict