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,遍历所有
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
相关产品推荐
相关产品推荐

