Python 在ElementTree中使用XPath按文本查找元素
给定如下所示的XML: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
<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')