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

时间:2012-05-31 15:04:24

标签: python xml xpath elementtree

给出如下的XML:

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

如何使用ElementTree将元素与内容A匹配并支持XPath?感谢

3 个答案:

答案 0 :(得分:32)

AFAIK ElementTree不支持XPath。它改变了吗?

无论如何,您可以使用lxml和以下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

答案 1 :(得分:9)

如果要使用标准库ElementTree而不是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!

注意:您可能希望在列表推导中对元素的text值进行一些剥离。

编辑这将适用于XML树中的任何深度。例如,

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

found = [element for element in e.getiterator() if element.text == 'A']

for f in found:
    print f

将打印

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

答案 2 :(得分:2)

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

config.findall('.//*[element="A"]/element')

正如来自@Bionicegenius的评论所解释的那样,如果你的元素没有sibilings,上面的表达式就可以了,但你明白了。可以在ElementTree中使用XPath,它是最简单的解决方案。