pythonlxml在知道使用xpath的子文本时获取父元素

2024-10-01 13:43:36 发布

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

我有以下xml文件:测试.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的子元素{}。获取父元素非常重要,因此我需要获取以下内容:

^{pr2}$

到目前为止,我得到的是:

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文档非常繁琐。如果有人有一个好的教程的链接,请至少把它作为评论。谢谢!在


Tags: http元素datetimeaddressbodyxmlsoapfieldname
3条回答

建议如下:

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

最好使用XPath表达式IMHO来获取父节点具有具有特定值的子节点,如下所示:

//d:TxnField[d:FieldName='Pickup.DateTime']

上面假设您已经将前缀d映射到默认名称空间uri。但从您的注释来看,您似乎更喜欢忽略名称空间,因此这是一个等效表达式,而不必注册名称空间前缀:

^{2}$

我找到了如何得到它:

p_time = xml_tree.xpath("//*[local-name()='TxnField']/*[text()='Pickup.DateTime']/./..")

相关问题 更多 >