如何解决扁平化和组合有序字典的部分
我已经获取了一个 xml 文件并使用 xmltodict 将其更改为一个有序的 dict。它看起来像这样:
XML 文件
<part_report>
<Metadata>
<data1>apple</data1>
<data2>car</data2>
<data3>date</data3>
</Metadata>
<parts>
<part>
<data4>people</data4>
<data5>cats</data5>
<data6>244234</data6>
</part>
<part>
<data4>children</data4>
<data5>dogs</data5>
<data6>342342</data6>
</part>
</parts>
</part_report>
OrderedDict
fullFile: OrderedDict([('part_report',OrderedDict([('Metadata',OrderedDict([('data1','apple'),('data2','car'),('data3','date')])),('parts',OrderedDict([('part',[OrderedDict([('data4','people'),('data5','cats'),('data6','244234')]),OrderedDict([('data4','children'),'dogs'),'342342')])])]))]))])
目标和问题 我需要做的是展平数据。我想将元数据数据与部分中每个部分的parts.part 数据结合起来。难点在于元数据和部分处于同一级别。如果部件是元数据的一个子级别,那么我可以做到这一点。
我一直在努力解决这个问题。我试图在 OrderedDict 中拆分单独的数据(即元数据 + part1、Metadata + part2 等),然后将它们组合起来。它不工作。我在尝试组合它们的第三行到最后一行失败。也许也不是最好的方法。对建议持开放态度。 最终目标是将其放入 dynamodb 数据库中。谢谢!!
这是我的代码:
import xmltodict
import json
import boto3
import os
import datetime
from xml.dom import minidom
# load file
with open('dummy.xml','r') as f:
#dummyxml ='<root>' + f.read() + '</root>'
dummyxml =f.read()
print(dummyxml)
# parse an xml file by name
my_xml = dummyxml
fullFile = xmltodict.parse(my_xml)
print('fullFile: ',fullFile)
# Serializing json
json_object = json.dumps(fullFile,indent = 4)
print('json_object: ',json_object)
#want to flatten dictionary by combining Metadata part of dictionary with the individual parts part of dictionary
allItems = [];
fullFile = xmltodict.parse(my_xml)
print('fullFile: ',json_object)
if("part_report" in fullFile):
catalog = fullFile["part_report"]
for key,value in catalog.items():
print('catalog')
print(key,value) # Metadata orderddict and parts ordereddict
print()
Metadata_part=catalog["Metadata"]
print('Metadata_part')
print(Metadata_part)
print()
parts_part = catalog["parts"]
print('parts_part')
print(parts_part)
print()
for key,value in parts_part.items():
cor=(key,value)
combo=Metadata_part.update(cor)
print('combo')
print()
解决方法
import xml.etree.ElementTree as ET
def process():
doc = ET.parse("test.xml")
metadata = [] # stores values from metadata
for node in doc.iter('metadata'):
for elem in node.iter():
if re.match(r'data\d',elem.tag):
metadata.append(elem.text)
parts_list = [] # stores values from parts/parts
for parts in doc.findall('./parts/'):
arr = []
for part in parts:
arr.append(part.text)
parts_list.append(arr)
results = [] # create desired list of tuples
for arr in parts_list:
result = tuple(metadata + arr)
results.append(result)
return results
output = process()
print(output)
将输出以下内容:
[('apple','car','date','people','cats','244234'),('apple','children','dogs','342342')]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。