我正在尝试在其中一个子元素中找到具有特定文本值的元素。 例如,
<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的一个子集。 寻求帮助。谢谢。
答案 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")
没有。