扁平化和组合有序字典的部分

问题描述

我已经获取了一个 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')]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...