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

2024-04-19 15:04:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些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>"""

注意,每个文档中可能有许多eventtable,并且事件可以比我隔离的事件有更多的细节。你知道吗

我的目标是创建一个以下形式的词典

{'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,而是使用暴力,但我似乎还没有找到一个例子。你知道吗

有没有一个更清晰和更python的方式来创建我所寻找的输出?你知道吗


Tags: 文件ofineventchildforvaluesome
1条回答
网友
1楼 · 发布于 2024-04-19 15:04:53

使用XPath拉出您感兴趣的元素。你知道吗

以下代码创建dict列表(即表/事务/信息):

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'}]]

相关问题 更多 >