使用Python3

时间:2016-12-08 17:37:42

标签: python xml dictionary generator-expression yield-from

我提供的XML文件包含我需要的数据,我需要将其转换为CSV格式。

这应该是直截了当的,但重复单位的孩子数量为#34; XML并不总是一样的。

我想要解决的是如何最好地迭代每个子元素的孩子,直到没有更多,并将其作为一个"行"返回。最终输出应该是一个字典列表(每个"一行和#34;对于CSV)。

作为一个例子

            <repeatingunit>
                <city>
                    <name>London</name>
                </city>
                <station>
                    <name>Southwark</name>
                    <tubeline>
                        <name>Jubilee</name>
                    </tubeline>
            </repeatingunit>
            <repeatingunit>
                <city>
                    <name>London</name>
                    <county>UK</county>
                <station>
                    <name>Mile End</name>
                </station>
            </repeatingunit>

这应该导致:

            {'city|name':'London','station|name':'Southwark','station|tubeline|name': 'Jubilee'},{'city|name':'London','city|country':'UK','station|name':'Mile End'}

我一直在使用xml.etree.ElementTree和root.iter,我对循环感到高兴,但它的动力。

我尝试将逻辑用于多个嵌套列表here,但无济于事。有人能指出我正确的方向建议一种新方法吗?

我知道最后不同长度的字典对于写出csv并不理想,但我可以根据我想要的输出处理它。

1 个答案:

答案 0 :(得分:0)

递归解决方案怎么样?

def build_key(elem, key, result):
    key = key + '|' + elem.name
    if not elem.children:
        result[key] = elem.text

    else:
        for child in elem.children:
            build_key(child, key, result)

results = []
for unit in soup.find_all('repeatingunit'):
    result = {}
    for child in unit.children:
        build_key(child, '', result)