告别繁琐XML解析!用xmltodict.parse像处理JSON一样轻松操作XML
本文介绍如何借助 xmltodict.parse() 方法,像处理 JSON 一样轻松读写 XML 内容。
在日常开发中,我们常常需要处理 XML 数据,无论是接口响应、配置文件还是数据存储格式。但 XML 解析通常需要借助 DOM 或 SAX 方式,代码写起来比较繁琐。
今天介绍一个 Python 神器:xmltodict,它的 parse 方法能快速将 XML 字符串转为 Python 字典,大大提升处理效率。
一、xmltodict.parse 是什么?
xmltodict.parse(res_text) 是 Python 第三方库 xmltodict
的核心方法,它的作用是将 XML 字符串解析成 Python 的字典(dict)或有序字典(OrderedDict),使我们可以像操作 JSON 一样轻松访问 XML 数据。
核心价值:
- 省去繁琐解析:不再需要手动解析 XML 节点
- 代码简洁明了:直接通过键名访问数据
- 转换灵活:可轻松将 XML 转为 JSON 或其他格式
二、使用场景
场景类型 | 描述 |
---|---|
爬虫/接口返回 | 处理微信、支付宝、SOAP、RSS 等返回的 XML 数据 |
配置文件读取 | 解析 XML 格式的配置文件,如 Spring、Tomcat 配置 |
数据格式转换 | 将 XML 转换为 JSON(先转 dict,再转 JSON 字符串) |
快速数据提取 | 避免写 XPath,直接通过字典键值获取数据 |
三、安装方法
使用前先安装库:
pip install xmltodict
四、基础用法与示例
示例XML:
<bookstore>
<book id="1">
<title>Python编程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book id="2">
<title>深度学习</title>
<author>李四</author>
<price>78.5</price>
</book>
</bookstore>
转换为字典:
import xmltodict
data = xmltodict.parse(xml_text)
print(data['bookstore']['book'][0]['title']) # 输出:Python编程
print(data['bookstore']['book'][1]['author']) # 输出:李四
五、实际应用示例:处理微信支付回调
from flask import request
import xmltodict
@app.route('/wxpay/notify', methods=['POST'])
def wxpay_notify():
xml_data = request.data.decode('utf-8')
data = xmltodict.parse(xml_data)['xml']
out_trade_no = data['out_trade_no']
result_code = data['result_code']
return '<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>'
六、参数详解(表格版)
参数名 | 说明 | 常用值 |
---|---|---|
xml_input |
必填,XML 文本 | str 或 bytes |
encoding |
编码方式 | 'utf-8' |
process_namespaces |
是否处理命名空间 | True/False |
force_list |
强制指定某些标签为列表 | ('book', ) |
attr_prefix |
属性前缀 | '@' |
disable_entities |
禁用外部实体(防XXE攻击) | 建议保持 True |
七、常见转换规则(XML → Dict)
XML 片段 | 转换后的字典结构 |
---|---|
<book id="1">Python</book> |
{'book': {'@id': '1', '#text': 'Python'}} |
<a><b>1</b><b>2</b></a> |
{'a': {'b': ['1', '2']}} |
<x y="z"/> |
{'x': {'@y': 'z'}} |
八、判断数据是 Dict 还是 JSON
判断方式 | 代码 | 结果类型 |
---|---|---|
是否为字典 | type(obj) == dict |
<class 'dict'> |
是否为 JSON 字符串 | type(obj) == str 且能通过 json.loads() |
<class 'str'> |
import json
data = xmltodict.parse(xml_string)
print(type(data)) # <class 'dict'>
json_str = json.dumps(data)
print(type(json_str)) # <class 'str'>
九、完整转换流程:XML → Dict → JSON
步骤 | 操作 | 输入 | 输出示例 | 说明 |
---|---|---|---|---|
① | 原始数据 | XML 字符串 | <user><name>Tom</name></user> |
原始 XML 格式 |
② | xmltodict.parse() |
①的输出 | {'user': {'name': 'Tom'}} |
转为 Python 字典 |
③ | json.dumps() |
②的输出 | {"user": {"name": "Tom"}} |
转为 JSON 字符串 |
import xmltodict, json
xml_text = "<user><name>Tom</name></user>"
dict_data = xmltodict.parse(xml_text)
json_text = json.dumps(dict_data, ensure_ascii=False, indent=2)
十、总结
- xmltodict.parse() 让我们能像处理 JSON 一样处理 XML,极大提升开发效率。
- 适用于接口响应、配置解析、数据转换等多种场景。
- 支持属性转换、强制列表、命名空间处理等高级功能。
- 推荐在不需要复杂 XML schema 验证的场景中使用。
如果你经常需要处理 XML,不妨试试 xmltodict,它也许能成为你的开发利器。
文章示例代码基于 Python 3,xmltodict 库。实际使用请根据环境调整。