我试图找到一个在其子元素之一中具有特定文本值的元素。
例如,
<peers>
<peer>
<offset>1</offset>
<tag>TRUE</tag>
</peer>
<peer>
<offset>2</offset>
<tag>FALSE</tag>
</peer>
</peers>
我想从这个 XML 文档中直接找到tag
in a peer
元素,其offset
值为 1。
为此,我有一个 XPath 表达式,如下所示:
./peers/peer[offset='1']/tag
但是在 ElementTree 中使用这样的表达式Element.find()
方法失败并给出None
而不是我感兴趣的“标签”元素:
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 的子集。
寻求帮助。谢谢。
Using lxml.etree
直接(同样should适用于ElementTree
),你可以得到这样的结果:
doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")
tag_elements
将是list of <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
UPDATE:
doc.xpath("/peers/peer[offset=1]/tag")
也工作正常。
But doc.xpath("./peers/peer[offset=1]/tag")
才不是。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)