2014-10-17 2 views
2

Я использую ElementTree для сканирования строки XML, извлеченной из текстового файла.ElementTree findtext не находит узлы листа

<root> 
    <branch_a> 
     <leaf>foo</leaf> 
    </branch_a> 
    <branch_b> 
     <another_leaf>bar</another_leaf> 
    </branch_b> 
</root> 

Когда я разобрать его и попытаться найти узлы листьев, я не получаю никакого результата:

>>> elem_tree = xml.etree.ElementTree.fromstring(xml_string) 
>>> leaf_text = elem_tree.findtext('leaf') 
>>> leaf_text is None 
True 

Но когда я траверс дерево, все работает отлично:

>>> elem_tree.findtext('branch_a/leaf') 
'foo' 

>>> branch = elem_tree.find('branch_a') 
>>> branch.findtext('leaf') 
'foo' 

Есть ли способ проверить ElementTree все дерево для меня? Мои имена ветвей динамичны, лист, который я ищу, может жить под любой веткой.

Я смог сделать это с помощью мини-юмора, но столкнулся с другими ограничениями. Вот что я делал там, для справки (ошибка проверки удалена).

>>> xml_doc = xml.dom.minidom.parseString(xml_string) 
>>> leaf_node = xml_doc.getElementsByTagName('leaf') 
>>> leaf_node[0].firstChild.nodeValue 
'foo' 

ответ

2

findtext использует оператор пути ElementTree стиль, так что вы сканировали только непосредственные дети. Это будет сканировать все дерево (см element xpath):

leaf_text = elem_tree.findtext('.//leaf') 
+0

Это именно то, что мне не хватало. Благодаря! –

1

Я делаю это так:

leaf_text = elem_tree.findall('.//leaf') 

for x in range(0, len(leaf_text)): 
    print leaf_text[x].text 
Смежные вопросы