Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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 在ElementTree中使用XPath按文本查找元素_Python_Xml_Xpath_Elementtree - Fatal编程技术网

Python 在ElementTree中使用XPath按文本查找元素

Python 在ElementTree中使用XPath按文本查找元素,python,xml,xpath,elementtree,Python,Xml,Xpath,Elementtree,给定如下所示的XML: <root> <element>A</element> <element>B</element> </root> A. B 如何使用ElementTree及其对XPath的支持将元素与内容相匹配?谢谢,AFAIK ElementTree不支持XPath。它变了吗 无论如何,您可以使用和以下XPath表达式: import lxml.etree doc = lxml.etree.p

给定如下所示的XML:

<root>
    <element>A</element>
    <element>B</element>
</root>

A.
B

如何使用ElementTree及其对XPath的支持将元素与内容相匹配?谢谢,AFAIK ElementTree不支持XPath。它变了吗

无论如何,您可以使用和以下XPath表达式:

import lxml.etree
doc = lxml.etree.parse('t.xml')
print doc.xpath('//element[text()="A"]')[0].text
print doc.xpath('//element[text()="A"]')[0].tag
结果将是:

A
element

如果希望使用标准库而不是lxml,可以使用迭代查找具有特定文本值的所有子元素。例如:

import sys
import xml.etree.ElementTree as etree

s = """<root>
    <element>A</element>
    <element>B</element>
</root>"""

e = etree.fromstring(s)

if sys.version_info < (2, 7):
    found = [element for element in e.getiterator() if element.text == 'A']
else:
    found = [element for element in e.iter() if element.text == 'A']

print found[0].text # This prints 'A', honestly!
将打印

<Element element at 7f20a882e3f8>
<Element sub at 7f20a882e4d0>

您可以使用。没有必要安装任何lib

config.findall('.//*[element="A"]/element')
正如@Bionicegenius的评论所解释的那样,如果你的元素没有发音,那么上面的表达式就可以工作,但是你明白了


在ElementTree中使用XPath是可能的,这是最简单的解决方案。

我选择在lxml上使用cElementTree,因为对于我的任务来说,它的内存开销要低得多(内存比CPU使用量更重要),这是我从lxml迁移过来所需的最后一段代码。您能解释一下“元素对元素”是什么吗意思是?@ElliottB它是列表理解的一部分。这有一个问题,即选择与所需节点处于同一级别的所有元素。这将找到值为A和B的两个元素。如果您将其修改为“查找”,那么它将只找到值为A的元素,即使您搜索了B,它也只会返回第一个子元素。ElementTree支持xpath,请参见下面的答案。
config.findall('.//*[element="A"]/element')