【问题标题】:Selecting parent element when child has a specific value of attribute using elementree xpath in Python当子元素具有特定属性值时在Python中使用elementree xpath选择父元素
【发布时间】:2016-05-04 17:51:45
【问题描述】:

我正在尝试使用 Python 的 ElementTree 来使用 XPath 表达式。我在提取子元素具有特定属性值的父元素时遇到困难。 here的例子中没有这些,我也试过this,这个不行。

我的 XML 文档如下所示:

<Transactions>
<Transaction>
    <Project code="abc">
        <Description>blah blah</Description>
        <StartDate>2014-10-02</StartDate>
    </Project>
    <Quantity>100</Quantity>
    <Price>
        <Currency code="EUR" />
        <Value>100</Value>
    </Price>
</Transaction>
<Transaction>
    <Project code="def">
        <Description>something else</Description>
        <StartDate>2014-10-12</StartDate>
    </Project>
    <Quantity>4</Quantity>
    <Price>
        <Currency code="EUR" />
        <Value>2</Value>
    </Price>
</Transaction>
<Transaction>
    <Project code="abc">
        <Description>blah blah</Description>
        <StartDate>2014-11-02</StartDate>
    </Project>
    <Quantity>1</Quantity>
    <Price>
        <Currency code="EUR" />
        <Value>123</Value>
    </Price>
</Transaction></Transactions>

我正在尝试选择项目代码为“abc”的所有事务元素。

我将我的根定义如下:

transactions = ET.parse('../doc.xml').getroot();

这有效(它返回所有将 Project 作为子项的 Transaction 元素):

transactions.findall("Transaction[Project]")

这也有效(返回所有代码为“abc”的项目元素):

transactions.findall(".//Project[@code='abc']")

但是我有点迷失如何组合这些(以获取子项目具有特定代码的事务元素)。这不起作用:

transactions.findall("Transaction[Project[@code='abc']]")

也不是这个(讨论here):

transactions.findall("Transaction[Project/@code='abc']")

我已经花了 4 个多小时试图解决这个问题 :(。如果有人能够为我回答这个问题,那将非常有帮助!

亲切的问候,

迪德里克

【问题讨论】:

    标签: python xml xpath attributes parent-child


    【解决方案1】:

    如果您正在使用(或者如果您将切换到)lxml.etree 并且将使用 .xpath() 方法,那么您的表达式将按原样工作:

    transactions.xpath("Transaction[Project[@code='abc']]")
    

    【讨论】:

    • 哇!我刚刚从 xml.etree.ElementTree 切换到 lxml.etree。我的 xpath 表达式现在不仅可以工作,而且速度也快了十倍!!谢谢你!
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多