[XML-SIG] Help with removeChild()

Thomas B. Passin tpassin@home.com
Thu, 10 May 2001 08:59:19 -0400


I think your problem is the inverse- the childNodes list ***is*** getting
updated by the DOM after each removal.

[Mike Hammill]

> That is only elements a, c, and e are eliminated.  The code is:
>
> def trim_dom_more(node):
>     if node.hasChildNodes():
>         for child in node.childNodes:
>             trim_dom_more(child)
>     else:
>         if node.nodeType == node.ELEMENT_NODE:
>             if (not node.hasAttributes()) and (not node.hasChildNodes()):
>                 node.parentNode.removeChild(node)
>
> I think I understand that the problem is that node.childNodes gets
evaluated
> and put on the stack, but then after the removeChild, this stacked list is
not
> re-evaluated so not all children are iterated through.  But how to solve
that?

 Try this:

 def trim_dom_more(node):
     if node.hasChildNodes():
         children=node.childNodes[:]
         for child in children:
             trim_dom_more(child)

Now you are iterating through a static copy of the list.  It wouldn't work
if the child nodes could get changed by another thread, but I don't suppose
that's going to happen here.

Or you could do

while node.hasChildNodes():
    trim_dom_more(node.childNodes[0])

That would execute slower, though.  But it wouldn't get fooled by any other
activity in the DOM.

Cheers,

Tom P