Python如何将XML转换为字典列表
发布时间 - 2026-01-01 00:00:00 点击率:次xmltodict处理同名节点需设force_list参数,否则默认合并为字典;属性转为@key,文本为#text,嵌套结构需手动提取;不规范XML应先用ElementTree校验。
用 xmltodict 处理单层同名节点最直接
当 XML 中存在多个同级同名标签(比如 ),xmltodict.parse() 默认会把它们合并成一个字典,而不是列表——这是最容易踩的坑。必须显式传入 force_list 参数才能保留为列表结构。
常见错误现象:
{'root': {'item': {'name': 'a'}}}(只留了一个)而非 {'root': {'item': [{'name': 'a'}, {'name': 'b'}]}}
- 对所有
item标签强制转为列表:force_list=['item'] - 若想统一处理所有重复标签,可设
force_list=True,但要注意这会让所有标签都变成列表(包括只出现一次的),后续取值需写[0] - 配合
process_namespaces=False(默认值)避免命名空间干扰,除非你明确需要解析带xmlns的 XML
嵌套结构里 list 和 dict 混用要手动 flatten
xmltodict 不会自动“扁平化”路径,比如 解析后是
{'data': {'items': {'item': {'name': 'A'}}}},而你想要的是 [{'name': 'A'}]。这时候不能只靠参数,得自己提取路径。
- 先用
xmltodict.parse(xml_str, force_list=['item'])得到嵌套结构 - 再用字典键路径访问:例如
result['data']['items']['item']—— 注意这里已经是列表(因为加了force_list) - 如果不确定某层是否存在,用
.get('items', {}).get('item', [])避免KeyError
遇到属性(@attr)和文本(#text)要小心类型混杂
XML 中的属性(如 )会被 xmltodict 转成 {'@id': '123', '#text': 'abc'}。如果你只需要纯内容,这些键名会干扰字段一致性。
- 遍历
列表时逐个清理:{k[1:]: v for k, v in item.items() if k.startswith('@')}提取属性,或过滤掉@和#text - 若文本是唯一内容且无属性,可用
item.get('#text', item)回退取值 - 不要依赖
str(item)或json.dumps直接输出——#text会导致字段名不统一
不用第三方库?标准库 xml.etree.ElementTree 更可控但更啰嗦
如果项目禁用外部依赖,xml.etree.ElementTree 是唯一选择,但它不自动生成字典,得手写递归逻辑。好处是能精确控制每个节点怎么转,坏处是容易漏掉属性、文本、命名空间等边缘情况。
- 用
elem.attrib取属性,elem.text.strip()取文本内容 - 子节点用
list(elem)遍历,对每个子节点递归调用转换函数 - 判断是否为同名多节点:先收集所有
elem.findall('item'),再逐个转字典,最后汇总成列表
import xml.etree.ElementTree as ETdef elem_to_dict(elem): result = {k: v for k, v in elem.attrib.items()} if elem.text and elem.text.strip(): result['#text'] = elem.text.strip() for child in elem: child_data = elem_to_dict(child) if child.tag not in result: result[child.tag] = child_data else:
已存在,转为列表
if not isinstance(result[child.tag], list): result[child.tag] = [result[child.tag]] result[child.tag].append(child_data) return resultroot = ET.fromstring(xml_str) data = {root.tag: elem_to_dict(root)}
真正麻烦的不是转换本身,而是 XML 源数据是否规范——有没有混用属性和文本、有没有缺闭合标签、有没有非法字符。建议先用
xml.etree.ElementTree.parse()尝试加载,捕获ParseError,比硬转字典更早发现问题。
# python # js # json # app # 标准库
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: 如何用已有域名快速搭建网站? Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程 Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤 如何使用 jQuery 正确渲染 Instagram 风格的标签列表 如何快速登录WAP自助建站平台? 如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗? LinuxShell函数封装方法_脚本复用设计思路【教程】 网站优化排名时,需要考虑哪些问题呢? 如何在不使用负向后查找的情况下匹配特定条件前的换行符 Laravel如何使用withoutEvents方法临时禁用模型事件 Laravel如何实现全文搜索功能?(Scout和Algolia示例) php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】 悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音 公司门户网站制作流程,华为官网怎么做? Laravel如何与Docker(Sail)协同开发?(环境搭建教程) 使用spring连接及操作mongodb3.0实例 node.js报错:Cannot find module 'ejs'的解决办法 JavaScript中的标签模板是什么_它如何扩展字符串功能 图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf? Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】 详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一) 高端智能建站公司优选:品牌定制与SEO优化一站式服务 Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理 googleplay官方入口在哪里_Google Play官方商店快速入口指南 米侠浏览器网页背景异常怎么办 米侠显示修复 如何在企业微信快速生成手机电脑官网? Laravel定时任务怎么设置_Laravel Crontab调度器配置 如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套) 如何快速搭建安全的FTP站点? 什么是javascript作用域_全局和局部作用域有什么区别? Bootstrap CSS布局之列表 Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转 宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法 Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】 Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程 Linux后台任务运行方法_nohup与&使用技巧【技巧】 非常酷的网站设计制作软件,酷培ai教育官方网站? 香港网站服务器数量如何影响SEO优化效果? 制作旅游网站html,怎样注册旅游网站? Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧 JavaScript数据类型有哪些_如何准确判断一个变量的类型 Laravel如何处理异常和错误?(Handler示例) 如何用景安虚拟主机手机版绑定域名建站? Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】 iOS验证手机号的正则表达式 如何在IIS中新建站点并配置端口与IP地址? 在线制作视频的网站有哪些,电脑如何制作视频短片? 如何快速查询网址的建站时间与历史轨迹? javascript中数组(Array)对象和字符串(String)对象的常用方法总结 Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】


列表时逐个清理: