【问题标题】:How to read XML with python ElementTree when there are multiple entries in each element当每个元素中有多个条目时如何使用python ElementTree读取XML
【发布时间】:2021-03-19 17:22:54
【问题描述】:

已编辑以包含一些额外信息

我有一些 XML 格式的数据,我已经设法在 Python 中使用 ElementTree 解析了这些数据。在主数据的每一行中都有一个名为volume 的标签,然后是一组数据,然后我将其放入一个数组中(我后来将其保存为熊猫数据框)。我遇到的问题是我需要知道我正在调用字段名称的条目的名称(即 [message, messagetimestamp,settlementdate,settlementperiod,etc...] 能够调用数据。

我想使用一些代码来告诉我该字段名称列表是什么,而不是手动输入它们。我在这里的 XML 术语可能有误,但数据看起来像所附图像。

XML 作为文本:

<response xmlns="http://www.netareports.com/backend/realtime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.netareports.com/backend/realtime http://www.netareports.com/backend/realtime.xsd" status="1" timestamp="2021-03-19T16:37:23">
<periodacceptedvolume message="BMRS.DISPTAV" messagetimestamp="2020-11-30T01:52:32" settlementdate="2020-11-30T00:00:00" settlementperiod="3" bmunitid="E_GYAR-1" bidofferpairnumber="-1" offervolume="0" bidvolume="-44.75" taggedoffervolume="0" repricedoffervolume="0" originallypricedoffervolume="0" taggedbidvolume="-44.531" repricedbidvolume="0" originallypricedbidbolume="-43.69"/>
<periodacceptedvolume message="BMRS.DISPTAV" messagetimestamp="2020-11-30T01:52:32" settlementdate="2020-11-30T00:00:00" settlementperiod="3" bmunitid="T_DAMC-1" bidofferpairnumber="1" offervolume="240" bidvolume="0" taggedoffervolume="240" repricedoffervolume="0" originallypricedoffervolume="0" taggedbidvolume="0" repricedbidvolume="0" originallypricedbidbolume="0"/>
<periodacceptedvolume message="BMRS.DISPTAV" messagetimestamp="2020-11-30T01:52:32" settlementdate="2020-11-30T00:00:00" settlementperiod="3" bmunitid="T_DIDCB6" bidofferpairnumber="1" offervolume="220" bidvolume="0" taggedoffervolume="220" repricedoffervolume="0" originallypricedoffervolume="0" taggedbidvolume="0" repricedbidvolume="0" originallypricedbidbolume="0"/>
<periodacceptedvolume message="BMRS.DISPTAV" messagetimestamp="2020-11-30T01:52:32" settlementdate="2020-11-30T00:00:00" settlementperiod="3" bmunitid="T_DINO-6" bidofferpairnumber="-1" offervolume="0" bidvolume="-2.592" taggedoffervolume="0" repricedoffervolume="0" originallypricedoffervolume="0" taggedbidvolume="-2.592" repricedbidvolume="0" originallypricedbidbolume="0"/>
<periodacceptedvolume message="BMRS.DISPTAV" messagetimestamp="2020-11-30T01:52:32" settlementdate="2020-11-30T00:00:00" settlementperiod="3" bmunitid="T_MEDP-1" bidofferpairnumber="1" offervolume="170" bidvolume="0" taggedoffervolume="170" repricedoffervolume="0" originallypricedoffervolume="0" taggedbidvolume="0" repricedbidvolume="0" originallypricedbidbolume="0"/>

我用来阅读的代码是:

    import xml.etree.ElementTree as ET
    import urllib.request

    url = #not included as it includes a password but the XML data is copied from the url
    download = urllib.request.urlopen(url).read()
    tree = ET.fromstring(download)

    fieldsV=['message','messagetimestamp','settlementdate','settlementperiod','bmunitid','bidofferpairnumber','offervolume','bidvolume','taggedoffervolume','repricedoffervolume','originallypricedoffervolume','taggedbidvolume','repricedbidvolume','originallypricedbidbolume']
    data = []
    for child in tree:
        data.append([(child.get(name) or '') for name in fields])

这工作正常,但fields 是我手动输入的列表,我想使用代码生成列表,以便可以将其应用于其他类似的 XML 文件。任何帮助将不胜感激!

【问题讨论】:

  • 请将 XML 提供为文本,而不是图像。
  • 还要确保您发布的代码是完整的并且可以实际运行(请参阅minimal reproducible example)。
  • 是否已经有一个数据框,其中包含从 XML 中提取的字段并包含您要处理的所有字段?如果是,您可以通过 pandas 轻松获取列标签。如果否,则该问题与 pandas 无关。
  • 您所说的“条目”或“字段名称”是 XML 术语中的 属性Element 对象的属性存储在其attrib 属性中。 docs.python.org/3/library/…

标签: python xml pandas elementtree


【解决方案1】:

假设 XML 根的所有子元素(本例中为 periodacceptedvolume 元素)包含相同的属性列表,您只需获取该元素的一个样本并从那里读取属性名称列表:

....
tree = ET.fromstring(download)

sample_node = tree.find('*')
fieldsV=[a for a in sample_node.attrib]
....

【讨论】:

  • @user15434516:如果这解决了您的问题,请将答案标记为已接受。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多