Python ElementTree:使用XPath通过其子文本查找元素

时间:2014-03-02 23:41:03

标签: python xml xpath elementtree

我正在尝试在其中一个子元素中找到具有特定文本值的元素。 例如,

<peers>
    <peer>
        <offset>1</offset>
        <tag>TRUE</tag>
    </peer>
    <peer>
        <offset>2</offset>
        <tag>FALSE</tag>
    </peer>
</peers>

我希望在此XML文档中直接找到tag元素peer的{​​{1}}元素中的offset

为此,我有一个XPath表达式如下:

./peers/peer[offset='1']/tag

然而,在ElementTree的Element.find()方法中使用此类表达式失败并提供None而不是我感兴趣的“tag”元素:

from xml.etree.ElementTree import fromstring

doc = fromstring("<peers><peer><offset>1</offset><tag>TRUE</tag></peer><peer><offset>2</offset><tag>FALSE</tag></peer></peers>")

tag = doc.find("./peers/peer[offset='1']/tag")

print tag


=> None

我倾向于认为这是我上面的XPath表达式错误,或者是由于ElementTree根据其文档仅支持XPath的一个子集。 寻求帮助。谢谢。

1 个答案:

答案 0 :(得分:5)

直接使用lxml.etree(相同的 应用于ElementTree),您可以实现以下结果:

doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")

tag_elements将是属于<tag>元素的<peer>元素的列表,其中<offset>元素包含1。

给定输入(我添加了<peer>子句以强调tag_elements是列表):

<peers>
    <peer>
        <offset>1</offset>
        <tag>TRUE</tag>
    </peer>
    <peer>
        <offset>1</offset>
        <tag>OTHER</tag>
    </peer>
    <peer>
        <offset>2</offset>
        <tag>FALSE</tag>
    </peer>
</peers>

tag_elements将包含两个元素:

for tag in tag_elements:
    print tag.text
-> TRUE
-> OTHER

<强>更新

doc.xpath("/peers/peer[offset=1]/tag")也可以。

doc.xpath("./peers/peer[offset=1]/tag")没有。