我提供的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并不理想,但我可以根据我想要的输出处理它。
答案 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)