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)
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)
您可以在 ElementTree 中使用XPath。不需要安装任何库。
config.findall('.//*[element="A"]/element')
Run Code Online (Sandbox Code Playgroud)
正如@Bionicegenius 的评论所解释的那样,如果您的元素没有兄弟姐妹,上面的表达式才有效,但您明白了。
可以在 ElementTree 中使用 XPath,这是最简单的解决方案。