python-mini-projects 实战:用 Python + xmltodict 将 XML 高效转换为 JSON(Convert_XML_To_JSON 全解析)
【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects
本指南围绕开源仓库 python-mini-projects 中的 Convert_XML_To_JSON 项目,系统讲解如何使用 Python 借助xmltodict库将任意 XML 文件转换为 JSON 文件。你将掌握从环境安装、脚本运行到源码逐行剖析、再到输入输出映射规律与工程化扩展的完整链路,可直接复用于配置文件解析、接口数据适配、数据迁移等真实场景。
一、项目背景与核心思路
在日常开发中,XML 与 JSON 是两种最常见的结构化数据格式:XML 擅长表达带属性(attribute)的复杂文档树,JSON 则因其轻量、易于 JavaScript 直接消费而成为 Web 与微服务间的主流交换格式。因此「XML 转 JSON」是数据接入、配置转换、系统集成中反复出现的高频需求。
仓库中的 converter.py 用不到 15 行代码给出了一个简洁、可复制的解决方案:
- 读取 XML 文件内容;
- 借助
xmltodict.parse()把 XML 解析为 Python 字典(dict); - 借助标准库
json.dumps()将字典序列化为 JSON 字符串; - 写入
output.json。
整个过程无需手写解析器,xmltodict负责把 XML 的元素、属性、层级关系完整映射到 Python 原生数据结构,再由标准库json完成最终序列化,这正是本项目的核心价值所在。
二、环境准备与依赖安装
2.1 依赖清单
项目仅依赖一个第三方库xmltodict。仓库根目录的 requirements.txt 明确锁定了版本:
xmltodict==0.12.0xmltodict是一个把 XML 文档解析为 Python dict 的轻量库,其安装方式与 README 中的说明一致:
$ pip install xmltodict为保持与项目完全一致的可复现环境,建议按锁定版本安装:
$ pip install -r requirements.txt提示:
json是 Python 标准库模块,无需单独安装;README 中「只需安装 xmltodict」的说法正是基于这一点。
2.2 目录结构
projects/Convert_XML_To_JSON/ ├── README.md # 项目说明文档 ├── converter.py # 核心转换脚本 ├── input.xml # 示例输入(图书目录 XML) ├── output.json # 示例输出(转换结果 JSON) └── requirements.txt # 依赖清单(xmltodict==0.12.0)三、快速上手:三步完成 XML 转 JSON
README 给出了极简的运行流程,可直接照做:
- 准备输入文件:将你要转换的 XML 文件重命名为
input.xml,放在与converter.py相同的目录下; - 执行脚本:运行
python3 converter.py; - 查看结果:转换结果会生成在同目录的
output.json中。
$ python3 converter.py运行成功后,目录中即出现output.json。README 特别强调输入文件必须命名为input.xml——这是因为脚本中的文件路径是硬编码的,这一点在下一节的源码分析中会详细展开。
四、源码逐行剖析:converter.py 的转换链路
converter.py 全文如下:
import json import xmltodict with open('input.xml') as xml_file: parsed_data = xmltodict.parse(xml_file.read()) xml_file.close() json_conversion = json.dumps(parsed_data) with open('output.json', 'w') as json_file: json_file.write(json_conversion) json_file.close()4.1 导入与解析:xmltodict.parse()
import json import xmltodictjson为标准库序列化模块,xmltodict为第三方解析库。核心调用:
parsed_data = xmltodict.parse(xml_file.read())xml_file.read()一次性读取整个 XML 文件的字符串内容,xmltodict.parse()将其解析为嵌套的 Python 字典。转换规则可总结为:
- XML 元素→ 字典的键(key);
- 元素文本内容→ 对应键的值;
- 元素属性(attribute)→ 以
@属性名为键存入该元素字典; - 同名重复元素→ 自动合并为列表(list)。
4.2 序列化:json.dumps()
json_conversion = json.dumps(parsed_data)json.dumps()将解析得到的 dict 序列化为 JSON 字符串。默认参数下的输出是不带缩进、键按字典序排列的紧凑格式,且所有值均为字符串(XML 中本就没有数字/布尔类型之分,价格、日期等也会保留为字符串)。
4.3 文件写入与资源管理
脚本对输入输出文件的打开/关闭做了成对处理:
with open('input.xml') as xml_file: ... xml_file.close() ... with open('output.json', 'w') as json_file: json_file.write(json_conversion) json_file.close()从源码结构看,input.xml以默认只读模式('r')打开,output.json以写模式('w')打开——若output.json已存在会被直接覆盖。代码在with块内部又显式调用了close(),属于冗余写法(with退出时本会自动关闭),但并不影响功能正确性。
五、输入输出对照:从 input.xml 到 output.json 的映射规律
仓库自带的 input.xml 与 output.json 是理解转换规则的最佳教材。输入是一份经典的图书目录 XML:
<?xml version="1.0"?> <catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> ... </catalog>转换后输出 JSON 的开头部分为:
{ "catalog": { "book": [ { "@id": "bk101", "author": "Gambardella, Matthew", "title": "XML Developer's Guide", "genre": "Computer", "price": "44.95", "publish_date": "2000-10-01", "description": "An in-depth look at creating applications \n with XML." }, ... ] } }对照两组数据,可以提炼出四条关键映射规律:
| XML 结构特征 | 转换后的 JSON 表现 | 示例 |
|---|---|---|
| 根元素 | 成为 JSON 最外层的唯一键 | <catalog>→"catalog": {...} |
| 元素属性 | 以@前缀作为键名 | id="bk101"→"@id": "bk101" |
| 同名重复元素 | 合并为 JSON 数组(list) | 12 个<book>→"book": [...] |
| 多行文本/空白 | 原样保留,含\n与缩进 | description 字段中的换行被转义保留 |
其中两点最值得注意:
- 属性与文本的区分:
@前缀是xmltodict的默认约定(可用attr_prefix参数修改),它保证了「属性」和「子元素」不会冲突; - 重复元素自动成数组:单个
<book>时"book"是字典,多个<book>时自动变为列表。这意味着消费方代码需要同时兼容「单对象」和「数组」两种形态,是 XML→JSON 转换中最常见的「坑」之一。
此外可观察到:JSON 中的"price": "44.95"、"publish_date": "2000-10-01"均为字符串,因为 XML 文本本身没有类型信息,xmltodict默认不会做类型推断。
六、工程化扩展:让脚本更贴近真实生产
基础脚本已能完成核心转换,但若要在真实项目中使用,可以从以下几个方向增强(以下代码为演示性扩展建议,供读者自行实践,不改动仓库内容):
6.1 支持命令行传入输入/输出路径
硬编码input.xml意味着每次转换都要重命名文件。使用argparse可让脚本接受任意路径:
import argparse import json import xmltodict parser = argparse.ArgumentParser(description='Convert XML file to JSON file') parser.add_argument('input', help='input XML file path') parser.add_argument('-o', '--output', default='output.json', help='output JSON file path (default: output.json)') args = parser.parse_args() with open(args.input) as xml_file: data = xmltodict.parse(xml_file.read()) with open(args.output, 'w') as json_file: json.dump(data, json_file, indent=2)此时运行方式升级为:
$ python3 converter_cli.py data.xml -o data.json6.2 美化输出与编码控制
json.dumps()的常用增强参数:
json.dumps(parsed_data, indent=2, ensure_ascii=False, sort_keys=False)indent=2:输出带缩进的可读格式,便于人工审查与 diff;ensure_ascii=False:保留中文等非 ASCII 字符原样输出(默认会转义为\uXXXX);sort_keys:控制键是否按字典序排序(默认False,保持 XML 文档顺序)。
6.3 处理 CDATA 与命名空间
真实 XML 常包含 CDATA 与命名空间,xmltodict均提供了对应参数:
cdata_key='#text':把 CDATA 内容放入指定键(默认#text);process_namespaces=True:解析命名空间前缀,配合namespaces参数做前缀映射;attr_prefix='@':可自定义属性键前缀,避免与业务键冲突。
6.4 容错处理
建议为脚本补充异常捕获,例如输入文件不存在、XML 语法错误(xml.parsers.expat.ExpatError)等情况,避免脚本直接抛出未处理异常中断。
七、常见问题与注意事项
- 输出格式是紧凑还是美化?默认
json.dumps()无缩进参数,输出为单行紧凑 JSON;如需可读性,请加上indent=2。 - 为什么属性名带
@?这是xmltodict的默认attr_prefix约定,可用参数修改,但消费方需保持一致。 - JSON 中所有值都是字符串吗?是的,
xmltodict不做类型推断,"price": "44.95"这类数字实际是字符串,业务侧如需数值需自行转换。 - 多个同名元素会怎样?自动合并为列表;当只有一个元素时则是字典,消费方代码需兼容两种形态。
output.json会被覆盖吗?会,脚本以'w'模式打开输出文件,重复运行会覆盖上一次的结果。
八、总结
python-mini-projects 仓库的 Convert_XML_To_JSON 项目用最小化的代码演示了「XML → dict → JSON」的完整转换链路:依赖xmltodict==0.12.0完成 XML 解析,借助标准库json完成序列化,配合 input.xml 与 output.json 的对照示例,清晰展示了属性@前缀、重复元素成数组、多行文本保留等核心映射规律。基于这份代码,你可以快速搭建出支持任意路径、美化输出、CDATA 与命名空间处理的完整转换工具,为实际项目中的数据格式适配提供坚实起点。
【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考