gpt4 book ai didi

python - 如何以 Python 方式使用 ElementTree 将标签的值与标签的标签相关联

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:51 26 4
gpt4 key购买 nike

我有一些正在尝试处理的 xml 文件。

这是来自其中一个文件的派生示例

fileAsString = """
<?xml version="1.0" encoding="utf-8"?>
<eventDocument>
<schemaVersion>X2</schemaVersion>

<eventTable>
<eventTransaction>
<eventTitle>
<value>Some Event</value>
</eventTitle>
<eventDate>
<value>2003-12-31</value>
</eventDate>
<eventCoding>
<eventType>47</eventType>
<eventCode>A</eventCode>
<footnoteId id="F1"/>
<footnoteId id="F2"/>
</eventCoding>
<eventCycled>
<value></value>
</eventCycled>
<eventAmounts>
<eventVoltage>
<value>40000</value>
</eventVoltage>
</eventAmounts>
</eventTransaction>
</eventTable>
</eventDocument>"""

请注意,每个文档中可以有许多事件表,并且事件可以包含比我隔离的事件更多的详细信息。

我的目标是创建以下形式的字典

{'eventTitle':'Some Event, 'eventDate':'2003-12-31','eventType':'47',\
'eventCode':'A', 'eventCoding_FTNT_1':'F1','eventCoding_FTNT_2':'F2',\
'eventCycled': , 'eventVoltage':'40000'}

我实际上是从文件中读取这些内容,但假设我有一个字符串,我的代码用于获取 eventTransaction 元素正下方元素的文本,其中文本位于值标记内,如下所示

import xml.etree.cElementTree as ET
myXML = ET.fromstring(fileAsString)
eventTransactions = [ e for e in myXML.iter() if e.tag == 'eventTransaction']
testTransaction = eventTransactions[0]
my_dict = {}
for child_of in testTransaction:
grand_children_tags = [e.tag for e in child_of]
if grand_children_tags == ['value']:
my_dict[child_of.tag] = [e.text for e in child_of][0]

>>> my_dict
{'eventTitle': 'Some Event', 'eventCycled': None, 'eventDate': '2003-12-31'}

这似乎是错误的,因为我并没有真正利用 xml,而是使用暴力,但我似乎没有找到示例。

是否有更清晰、更Pythonic的方式来创建我正在寻找的输出?

最佳答案

使用XPath提取您感兴趣的元素。

以下代码创建一个字典列表列表(即表/事务/信息):

tables = []
myXML = ET.fromstring(fileAsString)
for table in myXML.findall('./eventTable'):
transactions = []
tables.append(transactions)
for transaction in table.findall('./eventTransaction'):
info = {}
for element in table.findall('.//*[value]'):
info[element.tag] = element.find('./value').text or ''
coding = transaction.find('./eventCoding')
if coding is not None:
for tag in 'eventType', 'eventCode':
element = coding.find('./%s' % tag)
if element is not None:
info[tag] = element.text or ''
for index, element in enumerate(coding.findall('./footnoteId')):
info['eventCoding_FTNT_%d' % index] = element.get('id', '')
if info:
transactions.append(info)

输出:

[[{'eventCode': 'A',
'eventCoding_FTNT_0': 'F1',
'eventCoding_FTNT_1': 'F2',
'eventCycled': '',
'eventDate': '2003-12-31',
'eventTitle': 'Some Event',
'eventType': '47',
'eventVoltage': '40000'}]]

关于python - 如何以 Python 方式使用 ElementTree 将标签的值与标签的标签相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22885068/

26 4 0