我有以下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
的元素,该元素包含一个文本为FieldName
的子Pickup.DateTime
。获取父元素很重要,所以我需要得到这个:
<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文档非常繁琐。如果有人有一个好的教程链接,请至少发表评论作为评论。谢谢!
答案 0 :(得分:2)
我找到了如何获得它:
p_time = xml_tree.xpath("//*[local-name()='TxnField']/*[text()='Pickup.DateTime']/./..")
答案 1 :(得分:0)
这是一个建议:
from lxml import etree
NSMAP = {"s": "http://www.someaddress.com/someendpoint"}
xml_parser = etree.XMLParser(remove_blank_text=True)
xml_tree = etree.parse('test.xml', xml_parser)
p_time = xml_tree.xpath("//s:FieldName[.='Pickup.DateTime']", namespaces=NSMAP)[0]
parent = p_time.getparent()
s
前缀绑定到http://www.someaddress.com/someendpoint
命名空间。它在XPath表达式中使用,而不是local-name()
。xpath()
的调用会返回一个包含一个项目的列表(所需的FieldName
元素),然后使用getparent()
方法查找其父项。有多种方法可以做到!
不过,我认为这是一个非常好的lxml教程:http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html答案 2 :(得分:0)
优先使用XPath表达式,恕我直言,以获得具有特定值的子节点的父节点是这样的:
//d:TxnField[d:FieldName='Pickup.DateTime']
以上假设您已将前缀d
映射到默认命名空间uri。但是根据你的评论,你似乎更喜欢在这里忽略名称空间,所以这是等效的表达式而不必注册名称空间前缀:
//*[local-name()='TxnField'][*[local-name()='FieldName' and .='Pickup.DateTime']]