xmltodict解析XML生成OrderedDict后实现同层级字段扁平化拼接适配DynamoDB
实现方案与问题修正
现有代码的核心逻辑错误
- 对
metadata_part执行原地update操作会直接修改原始的元数据字典,无法生成独立的合并结果 - 遍历
parts_part时定位层级错误:拿到的键是字符串'part',对应的值是所有part组成的列表,没有下钻到单个part的字典层级 - 没有处理xmltodict的解析边界:当XML中只有1个part节点时,xmltodict不会将其解析为列表,会直接返回单个OrderedDict,原逻辑遇到这类场景会直接报错
- 传入
update方法的参数是一个元组而非字典结构,根本无法完成键值对合并
可直接运行的修正代码
import xmltodict import boto3 # 读取并解析XML with open('dummy.xml', 'r') as f: fullFile = xmltodict.parse(f.read()) # 提取固定的metadata部分,做浅拷贝避免污染原始解析结果 metadata = fullFile["part_report"]["metadata"].copy() # 提取所有part节点,兼容单part的边界情况 parts_container = fullFile["part_report"]["parts"]["part"] if not isinstance(parts_container, list): parts_list = [parts_container] else: parts_list = parts_container # 生成扁平化的合并结果 flattened_records = [] for single_part in parts_list: # 生成全新的字典对象,不修改原始结构 merged_record = { **metadata, **single_part } flattened_records.append(merged_record) # 后续可直接将flattened_records写入DynamoDB,结构完全匹配写入要求
合并后的结果示例
最终生成的flattened_records结构如下,每个条目都是完全扁平化的键值对,没有嵌套层级:
[ { "data1": "apple", "data2": "car", "data3": "date", "data4": "people", "data5": "cats", "data6": "244234" }, { "data1": "apple", "data2": "car", "data3": "date", "data4": "children", "data5": "dogs", "data6": "342342" } ]
内容的提问来源于stack exchange,提问作者Jennifer Crosby
相关产品推荐
相关产品推荐

