我有以下 xml 文件:test.xml
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SubmitTransaction xmlns="http://www.someaddress.com/someendpoint">
<objTransaction>
<DataFields>
<TxnField>
<FieldName>Pickup.Address.CountryCode</FieldName>
<FieldValue>DE</FieldValue>
<FieldIndex>0</FieldIndex>
</TxnField>
<TxnField>
<FieldName>Pickup.Address.PostalCode</FieldName>
<FieldValue>10827</FieldValue>
<FieldIndex>0</FieldIndex>
</TxnField>
<TxnField>
<FieldName>Pickup.DateTime</FieldName>
<FieldValue>2016-05-28T03:26:05</FieldValue>
<FieldIndex>0</FieldIndex>
</TxnField>
<TxnField>
<FieldName>Pickup.LocationTypeCode</FieldName>
<FieldValue>O</FieldValue>
<FieldIndex>0</FieldIndex>
</TxnField>
<TxnField>
<FieldName>Pickup.Address.City</FieldName>
<FieldValue>Berlin</FieldValue>
<FieldIndex>0</FieldIndex>
</TxnField>
</DataFields>
</objTransaction>
</SubmitTransaction>
</soap:Body>
</soap:Envelope>
我想要做的是获取带有标签 TxnField
的元素,该元素具有带有文本 Pickup.DateTime
的子 FieldName
。获取父元素很重要,所以我需要获取这个:
<TxnField>
<FieldName>Pickup.DateTime</FieldName>
<FieldValue>2016-05-28T03:26:05</FieldValue>
<FieldIndex>0</FieldIndex>
</TxnField>
到目前为止我所拥有的内容如下:
from lxml import etree
xml_parser = etree.XMLParser(remove_blank_text=True)
xml_tree = etree.parse('test.xml', xml_parser)
p_time = xml_tree.xpath("//*[local-name()='TxnField']/*[text()='Pickup.DateTime']")
print(p_time[0].tag) # {http://http://www.someaddress.com/someendpoint}FieldName
但这为我提供了带有文本 Pickup.DateTime
的实际元素,我有兴趣获取其父元素,如上所示。
附注:我花了将近一个小时才走到这一步,因为我发现 lxml 文档非常麻烦。如果有人有一个好的教程的链接,请至少将其作为评论发布。谢谢!
最佳答案
我已经找到了如何获取它:
p_time = xml_tree.xpath("//*[local-name()='TxnField']/*[text()='Pickup.DateTime']/./..")
关于当您使用 xpath 知道子文本时,python lxml 获取父元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31727100/