对接一个老系统,对方接口返回 XML,前端只认 JSON,拿到报文先得转一道。

XML 转 JSON 本身不难,难的是规则对不上。XML 有属性、有重复节点、文本还能和子节点混在一起,JSON 只有键值对,怎么映射要提前定好。

先定三条映射规则

  • 属性加 @ 前缀,比如 item 的 id 属性变成 item.@id
  • 同名兄弟节点统一转成数组,哪怕只有一个
  • 纯文本转字符串,数字要不要转成数值看下游需求

规则不统一,前后端各自转一遍就会出现字段对不上的情况。最好在接口层转一次,两边都用同一份结果。

Python 几行就能转

import xmltodict, json
with open('data.xml', encoding='utf-8') as f:
    data = xmltodict.parse(f.read())
print(json.dumps(data, ensure_ascii=False, indent=2))

xmltodict 默认把属性放进 @ 开头的键,空节点变成 None。想让某些节点永远是数组,传 force_list 参数指定名字。报文有命名空间时,process_namespaces 参数能帮忙去掉前缀。XML 声明里的 encoding 只说明文件编码,解析库不一定会自动照做,打开文件时显式指定 utf-8 最保险。

Node 这边用 fast-xml-parser

安装后 new 一个 XMLParser 即可,但它默认把节点文本放在 #text 键里,结构跟 Python 的结果不一样。可以调 ignoreAttributes 和 isArray 选项对齐,迁移前拿同一份报文对比输出。

命名空间和编码的坑

报文带 xmlns 时,键名会带上前缀,取值前先确认;文件不是 UTF-8 编码就先转码,否则中文会变成问号。属性顺序在 JSON 里不保证,别依赖它做校验。数值过大时还要留意精度,超过 16 位的编号当字符串处理更稳。转完抽查几条嵌套最深的记录,比整体扫一遍更容易发现丢字段。

判断:XML 转 JSON 的结构简单时,用在线工具转一次就行,但别把带业务数据的报文传到陌生网站;字段多、重复节点多,就写脚本固定映射规则,别每次手工对。