2014-10-10 1 views
0

Вот мой пример кода:Не можете найти теги после использования «установить» метод элемента с библиотекой cElementTree

import xml.etree.cElementTree as ET 

g = ET.Element('stuff') 
g.set('foo','bar') 
h = ET.ElementTree(g) 

С этой установкой, вот что происходит:

>>> g.iterfind('stuff') 
<generator object select at 0x10d38fa00> 
>>> _.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

>>> h.iterfind('stuff') 
<generator object select at 0x10d38fa00> 
>>> _.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

Я бы на самом деле довольно не используйте getiterator() и каждый раз итерации по всему дереву (хотя я думаю, что iterfind может делать это за кулисами). Почему это не удается найти? Он работает до того, как я сделаю set, но не после.

+0

Вы уверены, что это работает до того, как вы выполните 'set'? Это не для меня, и это не должно. У вашего узла 'stuff' нет потомков с именем' stuff', поэтому 'iterfind' (или' find', который немного проще использовать для интерактивной отладки) ничего не возвращает. – abarnert

ответ

0

Здесь нет ничего, что можно было бы найти. Вы создали узел stuff без каких-либо дочерних элементов, а затем запросили его для всех его потоковых узлов stuff, которых нет.

Он не работает до set больше, чем после него:

>>> import xml.etree.cElementTree as ET 
>>> g = ET.Element('stuff') 
>>> print g.find('stuff') 
None 
>>> next(g.iterfind('stuff')) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

И если вы разместите, что под другим узлом, он работает с или без set на либо один:

>>> f = ET.Element('parent') 
>>> f.append(g) 
>>> print f.find('stuff') 
<Element 'stuff' at 0x10edc5b10> 
>>> f.set('foo', 'bar') 
>>> g.set('foo', 'bar') 
>>> print f.find('stuff') 
<Element 'stuff' at 0x10edc5b10>