You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现JSON/XML同ID人员数据合并后导出XML的方法咨询

Python实现人员数据合并及XML输出方案

前置依赖

无需安装第三方库,直接使用Python标准库即可:

  • json:用于JSON文件读写解析
  • xml.etree.ElementTree:用于XML文件的解析和节点生成
  • xml.dom.minidom:可选,用于格式化输出XML,提升可读性

JSON源数据处理流程

实现思路:先读取JSON文件,用字典做ID维度的聚合,键为人员ID,值为该ID对应的所有data字段列表,聚合完成后再统一生成XML结构。

import json
import xml.etree.ElementTree as ET
from xml.dom import minidom

# 1. 读取并聚合JSON数据
person_agg = {}
with open("input.json", "r", encoding="utf-8") as f:
    json_data = json.load(f)
    for item in json_data:
        person_id = item["id"]
        # 不存在则初始化人员信息,可保留其他固定字段比如姓名、部门等
        if person_id not in person_agg:
            person_agg[person_id] = {
                "base_info": {k:v for k,v in item.items() if k != "data"},
                "data_list": []
            }
        # 追加当前条目的data字段
        person_agg[person_id]["data_list"].append(item["data"])

# 2. 生成XML结构
root = ET.Element("PERSONS")
for person_id, info in person_agg.items():
    person_node = ET.SubElement(root, "PERSON", id=person_id)
    # 写入其他基础字段
    for k, v in info["base_info"].items():
        sub_node = ET.SubElement(person_node, k.upper())
        sub_node.text = str(v)
    # 写入合并后的data字段
    for data_val in info["data_list"]:
        data_node = ET.SubElement(person_node, "DATA")
        data_node.text = str(data_val)

# 3. 格式化输出XML
rough_string = ET.tostring(root, 'utf-8')
reparsed = minidom.parseString(rough_string)
pretty_xml = reparsed.toprettyxml(indent="  ", encoding="utf-8")
with open("output_json.xml", "wb") as f:
    f.write(pretty_xml)

XML源数据处理流程

实现思路:先解析输入的原始XML,遍历所有节点,同样按ID属性聚合data字段,再重新生成目标XML结构。

import xml.etree.ElementTree as ET
from xml.dom import minidom

# 1. 解析并聚合XML源数据
person_agg = {}
tree = ET.parse("input.xml")
root = tree.getroot()
# 遍历原始XML里的所有PERSON节点
for person_node in root.findall(".//PERSON"):
    person_id = person_node.attrib.get("id")
    if not person_id:
        continue
    # 获取当前PERSON节点下的所有data内容
    current_data = [d.text for d in person_node.findall(".//DATA")]
    # 获取其他基础字段
    base_info = {}
    for child in person_node:
        if child.tag.upper() != "DATA":
            base_info[child.tag] = child.text
    # 聚合逻辑
    if person_id not in person_agg:
        person_agg[person_id] = {
            "base_info": base_info,
            "data_list": current_data
        }
    else:
        person_agg[person_id]["data_list"].extend(current_data)

# 2. 生成目标XML结构(和JSON处理的生成逻辑完全一致)
new_root = ET.Element("PERSONS")
for person_id, info in person_agg.items():
    person_node = ET.SubElement(new_root, "PERSON", id=person_id)
    for k, v in info["base_info"].items():
        sub_node = ET.SubElement(person_node, k.upper())
        sub_node.text = str(v)
    for data_val in info["data_list"]:
        data_node = ET.SubElement(person_node, "DATA")
        data_node.text = str(data_val)

# 3. 输出XML
rough_string = ET.tostring(new_root, 'utf-8')
reparsed = minidom.parseString(rough_string)
pretty_xml = reparsed.toprettyxml(indent="  ", encoding="utf-8")
with open("output_xml.xml", "wb") as f:
    f.write(pretty_xml)

注意事项

  • 如果原始数据中同ID人员的基础字段(姓名、年龄等)存在冲突,可以根据业务需求调整逻辑,比如取最新值、保留全部值等
  • XML的节点名、属性名可以根据实际业务格式调整,上述代码中的节点名仅为示例
  • 若数据中存在XML特殊字符(<、>、&等),xml.etree.ElementTree会自动做转义处理,无需额外编码

内容的提问来源于stack exchange,提问作者headmonster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:57:03