XML和JSON是两种常用的数据交换格式,很多场景下需要将XML文件转换为JSON格式,其中要求转换后的JSON中对应XML子元素的字段为数组类型,即使XML中该子元素只有一个实例也需要转为数组,这就是单元素转数组的核心需求。

XML转JSON的基础逻辑
XML转JSON的核心步骤是先解析XML文档,获取文档的节点树结构,再遍历节点树将每个节点的名称和文本内容、子节点信息映射到JSON的键值对中。普通的转换逻辑中,如果某个父节点下只有一个同名的子节点,转换后会直接将该子节点的内容作为对应键的值,而不是数组,这就不符合单元素转数组的要求。
普通转换的问题示例
假设我们有如下XML内容,其中<user>节点下只有一个<role>子节点:
<user>
<name>张三</name>
<role>管理员</role>
</user>
普通转换后的JSON会是:
{
"user": {
"name": "张三",
"role": "管理员"
}
}
而我们需要的<role>是数组格式,正确结果应该是:
{
"user": {
"name": "张三",
"role": ["管理员"]
}
}
单元素转数组的实现方案
要实现单元素转数组,需要在遍历XML节点时,先统计同名子节点的数量,如果数量大于等于1,就将该子节点的内容统一放到数组中。下面以Python语言为例,使用xml.etree.ElementTree模块实现转换逻辑。
完整转换代码
import xml.etree.ElementTree as ET
import json
def xml_to_json_with_array(xml_str):
# 解析XML字符串
root = ET.fromstring(xml_str)
# 递归转换节点
def parse_node(node):
result = {}
# 处理子节点
child_nodes = list(node)
if not child_nodes:
# 没有子节点,返回节点的文本内容
return node.text if node.text else ""
# 统计同名子节点的数量
child_tag_count = {}
for child in child_nodes:
tag = child.tag
child_tag_count[tag] = child_tag_count.get(tag, 0) + 1
# 遍历子节点构建结果
for child in child_nodes:
tag = child.tag
child_result = parse_node(child)
if child_tag_count[tag] > 1:
# 同名子节点多于1个,直接作为数组
if tag not in result:
result[tag] = []
result[tag].append(child_result)
else:
# 同名子节点只有1个,强制转为数组
result[tag] = [child_result]
return result
# 构建最终JSON结构
final_result = {root.tag: parse_node(root)}
return json.dumps(final_result, ensure_ascii=False, indent=4)
# 测试XML内容
test_xml = """<user>
<name>张三</name>
<role>管理员</role>
</user>"""
# 执行转换
json_result = xml_to_json_with_array(test_xml)
print(json_result)
代码逻辑说明
- 首先使用
ET.fromstring方法解析输入的XML字符串,得到根节点。 - 定义递归函数
parse_node,用于处理每个XML节点:先获取当前节点的所有子节点,统计每个标签名出现的次数。 - 遍历子节点时,不管同名子节点数量是1个还是多个,都将对应的值放到数组中,实现单元素转数组的需求。
- 最后将根节点的标签作为最外层键,调用
json.dumps方法生成格式化的JSON字符串。
多子元素的适配情况
如果XML中某个父节点下有多个同名子节点,上述代码同样可以正常处理,例如测试XML改为:
<user>
<name>张三</name>
<role>管理员</role>
<role>编辑</role>
</user>
转换后的JSON结果为:
{
"user": {
"name": "张三",
"role": ["管理员", "编辑"]
}
}
可以看到多个同名子节点也正确转换为了数组,符合预期要求。
注意事项
在实际使用中,还需要注意XML节点的属性处理,如果XML节点带有属性,需要额外将属性信息合并到JSON中,避免属性信息丢失。另外如果XML中存在混合内容(即节点同时包含文本和子节点),需要根据实际业务需求调整转换逻辑,确保转换后的JSON结构符合业务要求。
XMLJSONXML_to_JSON单元素转数组修改时间:2026-07-15 14:33:28