使用带有cElementTree库的元素的'set'方法后找不到标记

时间:2014-10-10 21:52:09

标签: python xml elementtree

这是我的示例代码:

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之前有效,但之后没有。

1 个答案:

答案 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>