关于XML的一个小问题。我正在使用ElementTree将XML转换为df,并最终上传到数据库中。我的问题是XML格式不是标准的。我看到的所有ElementTree示例都使用了不同的格式。它看起来像这样:
<session session_id="9">
<party party_id="1" name="party 1">
<member member_id="1" name="bob"/>
<member member_id="2" name="simon"/>
</party>
<party party_id="2" name="party 2">
<member member_id="3" name="diana"/>
<member member_id="4" name="pablo"/>
</party>
</session>
首先,所有信息都是用属性编写的,这不是什么大问题,因为我仍然可以获取它们。然而,我不仅想了解member
元素的属性,还想了解它们的父元素的属性。所以结果应该是这样的:
member_id | member_name | party_idsession_id | |||
---|---|---|---|---|---|
1 | 波波头 | 1 | 9 | ||
2 | simon | 1 | 9 | ||
3 | diana | 2 | 9 | ||
4 | pablo | 2 | 9 |
类似这个的东西
import xml.etree.ElementTree as ET
import pandas as pd
xml = '''<session session_id="9">
<party party_id="1" name="party 1">
<member member_id="1" name="bob"/>
<member member_id="2" name="simon"/>
</party>
<party party_id="2" name="party 2">
<member member_id="3" name="diana"/>
<member member_id="4" name="pablo"/>
</party>
</session>'''
data = []
root = ET.fromstring(xml)
session_id = root.attrib['session_id']
for party in root.findall('party'):
for memeber in party.findall('member'):
data.append({'session_id':session_id,'party_id': party.attrib['party_id']})
data[-1]['member_name'] = memeber.attrib['name']
data[-1]['member_id'] = memeber.attrib['member_id']
df = pd.DataFrame(data)
print(df)
输出
session_id party_id member_name member_id
0 9 1 bob 1
1 9 1 simon 2
2 9 2 diana 3
3 9 2 pablo 4
您的xml是完全有效且格式良好的,但下面的示例说明了xml通常是如何结构化的。
<parent attribute="supporting information">
Information
<child attribute="supporting information">
Information
</child>
</parent>
遗憾的是,ElementTree并没有提供一种将属性转换为标记内容/信息的巧妙方法。
解决方案
您已经完成了一半(如果我们计算根元素"session",则可能是第三个(。您必须按xml元素级别进行迭代。(例如,对于每个party元素,迭代每个成员(。