如何根据其索引使用 python etree 访问特定元素

How to access a specific element using python etree based on its index

我有一个看起来像这样的 xml 文件 :

<record>
 <cf tag='id'>A1eF4GT</cf>
 <df tag='123'>
  <sf tag='a'>Foo</sf>
  <sf> tag='u'>Bar</sf>
 </df>
 <df tag='123'>
 <sf tag='a'>Truc</sf>
 <sf tag='u'>Machin</sf>
</df>
</record>

我想用 Python Etree 解析它,我只是想得到“A1eF4GT;Foo/Bar;Truc/Machin”。到目前为止,我使用 findall 遍历 df tag='123',但我无法获得正确的对,我得到的只是“A1eF4GT;Foo/Bar;Truc/Bar”,因为“Bar”是我的代码在使用 'find' 时遇到的第一件事。我想有一些索引可以帮助我获得 df tag='123' 的位置,然后分配正确的值,但是我在代码处理的 documentation.The 部分找不到有用的东西看起来像这样:

for record in datafields:
    id=record.find(".//cf[@tag='id']")
    id=id.text.encode('utf8')
    if record.findall("df[@tag='123']/sf[@code='a']"):
        listequiv=[]
        
        for equiv in record.findall("df[@tag='123']/sf[@code='a']"):
            equiv=equiv.text
            equiv2=record.find("df[@tag='123']/sf[@code='u']")
            equiv2=equiv2.text                
            listequiv.append(equiv+'/'+equiv2)
            
        stringequiv=';'.join(listequiv)
        
       
            
        print ark+';'+stringequiv

我希望我说得足够清楚(抱歉我不是 IT 人...)

由于这是一个已知的树状结构,所以你必须先找到 df 条记录,然后在每条记录中找到 sf 条记录。

例如,df 条记录列表

>>> record.findall("df")
[<Element 'df' at 0x000001E32A942C20>, <Element 'df' at 0x000001E32A942D10>]

迭代示例:

>>> for elem in record.findall("df"):
...     for sub_elem in elem.findall("sf"):
...         print(sub_elem.text)
...
HALLO
Bar
Truc
Machin

您的示例(必须将编码降低到 utf-8join 才能工作

>>> listequiv = []
>>> cf_text = record.find(".//cf[@tag='id']").text
>>> listequiv.append(cf_text)
>>>
>>> for elem in record.findall("df"):
...     sf_elems = []
...     for sub_elem in elem.findall("sf"):
...         sf_elems.append(sub_elem.text)
...     listequiv.append("/".join(sf_elems))
...
>>> print(";".join(listequiv))
A1eF4GT;Foo/Bar;Truc/Machin