Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python元素树:按其子元素查找元素';使用XPath创建文本_Python_Xml_Xpath_Elementtree - Fatal编程技术网

Python元素树:按其子元素查找元素';使用XPath创建文本

Python元素树:按其子元素查找元素';使用XPath创建文本,python,xml,xpath,elementtree,Python,Xml,Xpath,Elementtree,我正在试图定位一个元素,该元素在其子元素中具有特定的文本值。 比如说, <peers> <peer> <offset>1</offset> <tag>TRUE</tag> </peer> <peer> <offset>2</offset> <tag>FALSE</tag&g

我正在试图定位一个元素,该元素在其子元素中具有特定的文本值。 比如说,

<peers>
    <peer>
        <offset>1</offset>
        <tag>TRUE</tag>
    </peer>
    <peer>
        <offset>2</offset>
        <tag>FALSE</tag>
    </peer>
</peers>
但是,在ElementTree的
元素.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
from xml.etree.ElementTree导入fromstring
doc=fromstring(“1TRUE2FALSE”)
tag=doc.find(“./peers/peer[offset='1']/tag”)
打印标签
=>无
我倾向于认为要么我上面的XPath表达式是错误的,要么是因为ElementTree的文档只支持XPath的一个子集。
正在寻求帮助。谢谢。

直接使用
lxml.etree
(这同样适用于
ElementTree
),您可以实现如下结果:

doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")
标记元素
将是
元素的列表,这些元素属于
元素,包含
元素,该元素包含1

给定输入(我添加了一个
子句以强调
标记元素
是一个列表):

更新

doc.xpath(“/peers/peer[offset=1]/tag”)
也可以正常工作


但是
doc.xpath(“./peers/peer[offset=1]/tag”)
没有问题。

您的xpath表达式非常好,在
ElementTree
中尝试您的建议会引发语法错误:无法在元素上使用绝对路径当被问及在
ElementTree
中使用XPath时,我看到许多人提到
lxml
。我真的应该改用
lxml
吗?就我个人而言,我放弃了
ElementTree
。。。我可以很好地使用
lxml.etree
doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")
<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>
for tag in tag_elements:
    print tag.text
-> TRUE
-> OTHER