news 2026/9/20 16:42:54

python-mini-projects 实战:用 Python + xmltodict 将 XML 高效转换为 JSON(Convert_XML_To_JSON 全解析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python-mini-projects 实战:用 Python + xmltodict 将 XML 高效转换为 JSON(Convert_XML_To_JSON 全解析)

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 行代码给出了一个简洁、可复制的解决方案:

  1. 读取 XML 文件内容;
  2. 借助xmltodict.parse()把 XML 解析为 Python 字典(dict);
  3. 借助标准库json.dumps()将字典序列化为 JSON 字符串;
  4. 写入output.json

整个过程无需手写解析器,xmltodict负责把 XML 的元素、属性、层级关系完整映射到 Python 原生数据结构,再由标准库json完成最终序列化,这正是本项目的核心价值所在。

二、环境准备与依赖安装

2.1 依赖清单

项目仅依赖一个第三方库xmltodict。仓库根目录的 requirements.txt 明确锁定了版本:

xmltodict==0.12.0

xmltodict是一个把 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 给出了极简的运行流程,可直接照做:

  1. 准备输入文件:将你要转换的 XML 文件重命名为input.xml,放在与converter.py相同的目录下;
  2. 执行脚本:运行python3 converter.py
  3. 查看结果:转换结果会生成在同目录的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 xmltodict

json为标准库序列化模块,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.json

6.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)等情况,避免脚本直接抛出未处理异常中断。

七、常见问题与注意事项

  1. 输出格式是紧凑还是美化?默认json.dumps()无缩进参数,输出为单行紧凑 JSON;如需可读性,请加上indent=2
  2. 为什么属性名带@这是xmltodict的默认attr_prefix约定,可用参数修改,但消费方需保持一致。
  3. JSON 中所有值都是字符串吗?是的,xmltodict不做类型推断,"price": "44.95"这类数字实际是字符串,业务侧如需数值需自行转换。
  4. 多个同名元素会怎样?自动合并为列表;当只有一个元素时则是字典,消费方代码需兼容两种形态。
  5. 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 16:42:43

CC Switch 切到 TaoToken:Claude Code 立即换上新模型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 16:42:26

倾转旋翼飞行器过渡段仿真复现:基于XV-15的建模与配平解析

简介&#xff1a;这份资源是一份面向航空航天工程研究人员、研究生及工程师的论文复现资料&#xff0c;围绕XV-15倾转旋翼机过渡段仿真展开&#xff0c;重点解决从直升机模式到定翼机模式转换中的动力学建模、配平、线性化与操纵特性分析问题。资源包含详细的MATLAB/Simulink建…

作者头像 李华
网站建设 2026/9/20 16:42:10

LLVM编译器框架实战:从源码编译到自定义Pass开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 16:41:46

Win11剪贴板失效?两步快速恢复与深层原因排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 16:41:37

嵌入式嵌套结构体内存布局与对齐实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 16:41:03

OpenClaw 2.0 多 Agent 任务要统一模型通道,TaoToken 行不行?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华