Вопрос по python, xml – Найти элемент по тексту с помощью XPath в ElementTree

12

Приведенный XML похож на следующее:

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

Как сопоставить элемент с содержимым A, используя ElementTree и его поддержку XPath? Спасибо

Ваш Ответ

3   ответа
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 Значение ваших элементов в списке понимания.

Edit Это будет работать на любой глубине в вашем дереве 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>
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Ты можешь использоватьXPath в ElementTree, Нет необходимости устанавливать любую библиотеку.

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

Как объясняет приведенный ниже комментарий @Bionicegenius, приведенное выше выражение просто работает, если у вашего элемента нет сибилингов, но вы поняли идею. В ElementTree можно использовать XPath, и это самое простое решение.

Error: User Rate Limit Exceeded
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
Error: User Rate Limit Exceeded

Похожие вопросы