如何解决当每个元素中有多个条目时,如何使用 python ElementTree 读取 XML
编辑以包含一些额外信息
我有一些 XML 格式的数据,我设法在 Python 中使用 ElementTree
解析了这些数据。在主数据的每一行中,都有一个名为 volume
的标签,然后是一组数据,然后我将其放入一个数组中(稍后我将其保存为一个 Pandas 数据帧)。我遇到的问题是我需要知道我调用字段名称的条目的名称(即 [message
、messagetimestamp
、settlementdate
、settlementperiod
、等...] 以便能够调用数据。
我想使用一些代码来告诉我该字段名称列表是什么,而不是手动输入它们。我的 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 根的所有子元素(本例中的 periodacceptedvolume
元素)包含相同的属性列表,您只需获取该元素的一个样本并从中读取属性名称列表:
....
tree = ET.fromstring(download)
sample_node = tree.find('*')
fieldsV=[a for a in sample_node.attrib]
....
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。