当您使用 xpath 知道子文本时,python lxml 获取父元素

标签 python xml xpath lxml

我有以下 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/

相关文章:

xml - XPath 3.x - 排序功能

c# - 使用 XPath 精确匹配字符串

php - 如何使用 PHP 提取 XML 数据数据?

javascript - 当 XML 内容作为 XML 文件接收时,使用 Ajax 和 Javascript 加载 XML 数据

.net - 使用 XmlNamespaceManager 检索所有 namespace 的列表

java - 如何使用 webdriver 查找按钮元素

python - 获取图像中的所有 R-G-B

python - 我需要一个用于 python 中 mp3 文件 url 的 href 属性的正则表达式

python - 如何使用数据 URI 方案显示来自 ndb 数据存储的图像(通过将数据传递到模板而不必发出另一个请求)

python - 如何在 Python 中散列变量?