这是我的示例代码:
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()
并且每次迭代整个树(尽管我猜它可能会在幕后进行)。为什么找不到这个东西?它在我执行set
之前有效,但之后没有。
答案 0 :(得分: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>