我有一个像这样的XML:
<example>
<para>
<phrase>child_0</phrase>
child_1
<phrase>child_2</phrase>
</para>
</example>
,我想让它看起来像这样:
<foo>
<phrase>child_0</phrase>
child_1
<phrase>child_2</phrase>
</foo>
简单,对吧?我创建了一个新的父节点——<foo>
——然后遍历<para>
节点,并将子节点附加到新的<foo>
节点。
奇怪的是,child_1
(一个文本节点)消失时,我试图这样做。如果我简单地遍历<para>
节点,我得到以下结果:
>>> for p in para.childNodes:
print p.nodeType
1
3
1
所以有3个子节点,中间的是文本节点。但是当我试图将它附加到新的<foo>
节点时,它没有成功。
>>> for p in para.childNodes:
foo_node.appendChild(p)
>>> print foo_node.toprettyxml()
<foo>
<phrase>child_0</phrase>
<phrase>child_2</phrase>
</foo>
@#$%&*!
是怎么回事?
好了,我来回答我自己的问题。
appendChild()
函数从<para>
节点列表中删除子节点,因此当索引与每次迭代不同步时,您将有效地跳过所有其他元素。解决方案是附加节点的副本:
for p in para.childNodes:
p_copy = p.cloneNode(deep=True)
foo_node.appendChild(p_copy)