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

pis*_*hio 13 python xml xpath elementtree

给定如下的XML:

<root>
    <element>A</element>
    <element>B</element>
</root>
Run Code Online (Sandbox Code Playgroud)

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

bra*_*zzi 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
Run Code Online (Sandbox Code Playgroud)

结果将是:

A
element
Run Code Online (Sandbox Code Playgroud)

  • ElementTree 支持 xpath,请看下面我的回答。 (2认同)

Chr*_*ris 10

如果要使用标准库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!
Run Code Online (Sandbox Code Playgroud)

注意:您可能希望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
Run Code Online (Sandbox Code Playgroud)

将打印

<Element element at 7f20a882e3f8>
<Element sub at 7f20a882e4d0>
Run Code Online (Sandbox Code Playgroud)


nev*_*ves 9

您可以在 ElementTree 中使用XPath。不需要安装任何库。

config.findall('.//*[element="A"]/element')
Run Code Online (Sandbox Code Playgroud)

正如@Bionicegenius 的评论所解释的那样,如果您的元素没有兄弟姐妹,上面的表达式才有效,但您明白了。

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

  • 这存在选择与所需节点相同级别的所有元素的问题。这将找到值为 A 和 B 的两个元素。如果您修改它以查找,那么它只会找到值为 A 的元素,即使您搜索 B - 它也只会返回第一个子元素。 (2认同)
  • 通过文本搜索是最近添加的,语法是 `.//element[.="A"]` 。上面的答案是行不通的。ElementTree 仅支持 XPath 的非常有限的子集。 (2认同)