This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: xml.dom.minidom.Node.removeChild() doesn't remove
Type: Stage:
Components: XML Versions: Python 2.3
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: bobince, mkempka
Priority: normal Keywords:

Created on 2005-03-06 21:17 by mkempka, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
dombug.py mkempka, 2005-03-06 21:17 code to demonstrate the bug
errorintroducer.xml mkempka, 2005-03-06 21:18 the xml file that produces the error
errorfree.xml mkempka, 2005-03-06 21:19 the (almost) same contents that don't produce the error
Messages (4)
msg24480 - (view) Author: Matthias Kempka (mkempka) Date: 2005-03-06 21:17
There seems to be a constellation where
xml.dom.minidom.Node.removeChild() doesn't remove
childs properly.

I found this bug in 2.3.4 and it is still in:

Python 2.3.5 (#2, Feb  9 2005, 00:38:15)
[GCC 3.3.5 (Debian 1:3.3.5-8)] on linux2


I attached 3 files, the dombug.py demonstrates the
problem: 

First, I iterate over all children of a specific
element, check their tag name and remove them using
removeChild() and then child.unlink().
After the elements are removed I iterate again, do the
same check for a tag and find there are still elements
in there. That is, there are still elements in there
when I parse the file errorintroducer.xml. When I parse
the file errorfree.xml the elements are all removed. 

The difference between the xml files is the carriage
return after each closing tag. 

Since to my knowledge both xml files are well-formed I
would expect in both cases that all elements are removed.
msg24481 - (view) Author: Matthias Kempka (mkempka) Date: 2005-03-06 21:24
Logged In: YES 
user_id=736381

so.. this form posts the error report with uploading
files...interesting...

Anyway, the output I get when running the program with
errorintroducer.xml is:

> python dombug.py
found element 1
 .. removed
found element 3
 .. removed
found element 5
 .. removed
-----------everything removed from timerList[0]---------------
found Element    2
found Element    4
found Element    6


imho it should be, as it is with errorfree.xml:

found element 1
 .. removed
found element 2
 .. removed
found element 3
 .. removed
found element 4
 .. removed
found element 5
 .. removed
found element 6
 .. removed
-----------everything removed from timerList[0]---------------
msg24482 - (view) Author: Andrew Clover (bobince) * Date: 2005-03-11 08:25
Logged In: YES 
user_id=311085

Bug should be marked INVALID.

childNodes lists are 'live'. You are iterating over a list
you are destroying at the same time. The code is equivalent
to the more obviously broken:

  foo= [1, 2, 3, 4]
  i= 0
  while i<len(foo):
    del foo[i]
    i+= 1
  foo
  >>> [2, 4]

The 'working' example only works because it has extra
whitespace nodes in, so when you delete child number i, the
child i+1 that is skipped over is a Text node containing
only whitespace.

BTW, there's a separate bug tracker for the PyXML project
from which minidom is taken. You may get better results by
submitting there (and discussing on the XML-SIG list).
msg24483 - (view) Author: Matthias Kempka (mkempka) Date: 2005-05-20 21:44
Logged In: YES 
user_id=736381

well then, invalid.
History
Date User Action Args
2022-04-11 14:56:10adminsetgithub: 41659
2005-03-06 21:17:08mkempkacreate