Patch #102492, fixing bug #116677:
    give minidom.py behaviour that complies with the DOM Level 1 REC,
    which says that when a node newChild is added to the tree, "if the
    newChild is already in the tree, it is first removed."

    pulldom.py is patched to use the public minidom interface instead
    of setting .parentNode itself.  Possibly this reduces pulldom's
    efficiency; someone else will have to pronounce on that.
diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py
index e674385..7f5ef79 100644
--- a/Lib/xml/dom/pulldom.py
+++ b/Lib/xml/dom/pulldom.py
@@ -55,7 +55,9 @@
             attr.value = value
             node.setAttributeNode(attr)
 
-        node.parentNode = self.curNode
+##        print self.curNode, self.curNode.childNodes, node, node.parentNode
+        self.curNode.appendChild(node)
+#        node.parentNode = self.curNode
         self.curNode = node
 
         self.lastEvent[1] = [(START_ELEMENT, node), None]
@@ -77,7 +79,8 @@
             attr.value = value
             node.setAttributeNode(attr)
 
-        node.parentNode = self.curNode
+        #node.parentNode = self.curNode
+        self.curNode.appendChild(node)
         self.curNode = node
 
         self.lastEvent[1] = [(START_ELEMENT, node), None]
@@ -93,8 +96,9 @@
 
     def comment(self, s):
         node = self.document.createComment(s)
-        parent = self.curNode
-        node.parentNode = parent
+        self.curNode.appendChild(node)
+#        parent = self.curNode
+#        node.parentNode = parent
         self.lastEvent[1] = [(COMMENT, node), None]
         self.lastEvent = self.lastEvent[1]
         #self.events.append((COMMENT, node))
@@ -102,24 +106,27 @@
     def processingInstruction(self, target, data):
         node = self.document.createProcessingInstruction(target, data)
 
-        parent = self.curNode
-        node.parentNode = parent
+        self.curNode.appendChild(node)
+#        parent = self.curNode
+#        node.parentNode = parent
         self.lastEvent[1] = [(PROCESSING_INSTRUCTION, node), None]
         self.lastEvent = self.lastEvent[1]
         #self.events.append((PROCESSING_INSTRUCTION, node))
 
     def ignorableWhitespace(self, chars):
         node = self.document.createTextNode(chars)
-        parent = self.curNode
-        node.parentNode = parent
+        self.curNode.appendChild(node)
+#        parent = self.curNode
+#        node.parentNode = parent
         self.lastEvent[1] = [(IGNORABLE_WHITESPACE, node), None]
         self.lastEvent = self.lastEvent[1]
         #self.events.append((IGNORABLE_WHITESPACE, node))
 
     def characters(self, chars):
         node = self.document.createTextNode(chars)
-        parent = self.curNode
-        node.parentNode = parent
+        self.curNode.appendChild(node)
+#        parent = self.curNode
+#        node.parentNode = parent
         self.lastEvent[1] = [(CHARACTERS, node), None]
         self.lastEvent = self.lastEvent[1]