0

我从 Stackoverflow 尝试了大约 15 个答案,但没有任何帮助。我想将任何(!)嵌套的 XML 文件转换为 CSV。我不想写在 XML 的程序直接元素中。网络上有许多在线服务,我可以上传任何 xml,也可以下载 CSV。我不需要说我想要什么具体的元素。

如果重复某些内容(经典示例 - 项目),我希望将一个项目放在一行中,每个数据都放在文档的页眉和页脚上。也许我们可以称之为笛卡尔积。很好的例子(我想要的)显示http://convertcsv.com/xml-to-csv.htm为“向下透视数据而不是展平”(步骤 2 中的可选)

我的 XML 示例:

<fav>
    <inv>
        <number>202101</number>
        <item>
            <q>50</q>
            <note>AAA</note>
            <more>999999999</more>
        </item>
        <adr>Bananos 15</adr>
        <item>
            <q>150</q>
            <note>BBB</note>
            <item_adr>Something...</item_adr>
        </item>
        <summary>
            <sum>500</sum>
        </summary>
    </inv>
    <inv>
        <number>202102</number>
        <item>
            <q>99950</q>
            <note>XXX</note>
            <item_adr3>Appleos 50</item_adr3>
        </item>
        <item>
            <q>150</q>
            <note>YYY</note>
        </item>
    </inv>
</fav>

我想要什么,这个结果:

number,item/0/q,item/0/note,item/0/more,adr,summary/sum,item/0/item_adr3
202101,50,AAA,999999999,Bananos 15,500,
202101,150,BBB,,Bananos 15,500,
202102,99950,XXX,,,,Appleos 50
202102,150,YYY,,,,

我尝试使用 xmltodict。

inputfiles = list_all_xml_files(os.getcwd())
for file in inputfiles:
    handle = open(file, "r", encoding='utf-8')
    content = handle.read()
    # https://github.com/martinblech/xmltodict
    dict = xmltodict.parse(content)

结果是:

OrderedDict([('fav', OrderedDict([('inv', [OrderedDict([('number', '202101'), ('item', [OrderedDict([('q', '50'), ('note', 'AAA'), ('more', '999999999')]), OrderedDict([('q', '150'), ('note', 'BBB'), ('item_adr', 'Something...')])]), ('adr', 'Bananos 15'), ('summary', OrderedDict([('sum', '500')]))]), OrderedDict([('number', '202102'), ('item', [OrderedDict([('q', '99950'), ('note', 'XXX'), ('item_adr3', 'Appleos 50')]), OrderedDict([('q', '150'), ('note', 'YYY')])])])])]))])

但是,接下来呢?

我要求

  1. 展平数据
  2. 创建行(带有重复项目的组合(笛卡尔积?))

对于我的示例,我在 Stackoverflow 中发现的所有内容均不正确。

你能帮助我吗?我希望,我不是 Universum 解决问题的第一人。非常感谢...

4

0 回答 0