Учитывая XML, как показано ниже:
<root>
<element>A</element>
<element>B</element>
</root>
Как я могу сопоставить элемент с контентом A, используя ElementTree и его поддержку XPath? Благодаря
Учитывая XML, как показано ниже:
<root>
<element>A</element>
<element>B</element>
</root>
Как я могу сопоставить элемент с контентом A, используя ElementTree и его поддержку XPath? Благодаря
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
Если вы хотите использовать стандартную библиотеку 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>
Вы можете использовать XPath в ElementTree. Нет необходимости устанавливать lib.
config.findall('.//*[element="A"]/element')
Как поясняет пояснитель @Bionicegenius, выражение выше просто работает, если у вашего элемента нет братьев, но вы получаете идею использования xpath в дереве элементов.