【问题标题】:Reading XML that uses attributes读取使用属性的 XML
【发布时间】:2022-01-13 05:42:11
【问题描述】:

一个关于 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_id session_id
1 bob 1 9
2 simon 1 9
3 diana 2 9
4 pablo 2 9

我使用children = list(root.iter()) 列出所有孩子,然后将它们的属性附加到数据框。但是我失去了与父级的链接,所以我不能真正说出member 来自哪个party 分支,所以我无法分配正确的party_id

我想知道是否有一种简单的方法可以从这种 XML 结构中获取数据帧?

【问题讨论】:

  • 欢迎来到 Stack Overflow。以minimal reproducible example 的形式向我们展示代码。关于获取父级,见stackoverflow.com/q/24239435/407651stackoverflow.com/q/2170610/407651
  • 找到所有的party标签,并为每一个标签遍历他们的member,也就是说,这样你在看孩子时就知道父母。奇怪的是,ElementTree 中有一个 findall() 方法,请查看文档。
  • 仅供参考,您的 XML 没有任何“非标准”。这只是... xml。
  • 仅仅因为你作为一个新手,以前没有见过这样的 XML 并不意味着它是“非标准的”。你真的应该重新考虑你的学习策略:阅读你用来学习它们概念的技术,而不是每次遇到新事物时都感到惊讶。

标签: python xml dataframe elementtree


【解决方案1】:

类似的东西

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

【讨论】:

  • 为什么在收集完所有数据后使用-1索引而不是附加元素?
【解决方案2】:

您的 xml 完全有效且格式正确,但下面的示例说明了 xml 通常的结构。

<parent attribute="supporting information">
    Information
    <child attribute="supporting information">
        Information
    </child>
</parent>

唉,ElementTree 没有提供将属性转换为标签内容/信息的简洁方法。

解决方案
您已经完成了一半(如果我们计算根元素“会话”,则可能是第三个)。您必须对每个 xml 元素级别进行迭代。 (例如,对于每个派对元素,迭代每个成员)。

【讨论】:

  • XML 规范w3.org/TR/xml 指定了 XML 的语法,而您的“支持信息”和“信息”示例正是这样:一个示例,即它不是规范的一部分,例如“支持”不在规范中。所以 XML 没有指定你所做的区分——它可以这样使用,也可以不这样使用——两者都是有效的。
  • 公平点@balmy,我会编辑答案。
  • 正如 OP 的示例可能显示的那样,可能没有“通常”的方式来构建 XML,只有“通常”或适合不同数据和目的的不同方式。
猜你喜欢
  • 2010-10-30
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2011-07-14
相关资源
最近更新 更多