From 04a45e9bb159f348ba722d0b49f9837f91cceaea Mon Sep 17 00:00:00 2001 From: "Andrew M. Kuchling" Date: Wed, 20 Dec 2000 14:47:24 +0000 Subject: [PATCH] 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. --- Lib/xml/dom/minidom.py | 25 +++++++++++++++++++++++++ Lib/xml/dom/pulldom.py | 27 +++++++++++++++++---------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 2d3755c69b0..d078f39db37 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -40,6 +40,7 @@ class Node(_Node): def __init__(self): self.childNodes = [] + self.parentNode = None if Node._debug: index = repr(id(self)) + repr(self.__class__) Node.allnodes[index] = repr(self.__dict__) @@ -98,6 +99,8 @@ def _get_lastChild(self): return self.childNodes[-1] def insertBefore(self, newChild, refChild): + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) if refChild is None: self.appendChild(newChild) else: @@ -116,6 +119,8 @@ def insertBefore(self, newChild, refChild): return newChild def appendChild(self, node): + if node.parentNode is not None: + node.parentNode.removeChild(node) if self.childNodes: last = self.lastChild node.previousSibling = last @@ -129,6 +134,8 @@ def appendChild(self, node): return node def replaceChild(self, newChild, oldChild): + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) if newChild is oldChild: return index = self.childNodes.index(oldChild) @@ -144,6 +151,12 @@ def replaceChild(self, newChild, oldChild): def removeChild(self, oldChild): self.childNodes.remove(oldChild) + if oldChild.nextSibling is not None: + oldChild.nextSibling.previousSibling = oldChild.previousSibling + if oldChild.previousSibling is not None: + oldChild.previousSibling.nextSibling = oldChild.nextSibling + oldChild.nextSibling = oldChild.previousSibling = None + if self._makeParentNodes: oldChild.parentNode = None return oldChild @@ -606,11 +619,23 @@ class Document(Node): implementation = DOMImplementation() def appendChild(self, node): + if node.parentNode is not None: + node.parentNode.removeChild(node) + if node.nodeType == Node.ELEMENT_NODE \ and self._get_documentElement(): raise TypeError, "two document elements disallowed" return Node.appendChild(self, node) + def removeChild(self, oldChild): + self.childNodes.remove(oldChild) + oldChild.nextSibling = oldChild.previousSibling = None + oldChild.parentNode = None + if self.documentElement is oldChild: + self.documentElement = None + + return oldChild + def _get_documentElement(self): for node in self.childNodes: if node.nodeType == Node.ELEMENT_NODE: diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py index e674385307e..7f5ef79739a 100644 --- a/Lib/xml/dom/pulldom.py +++ b/Lib/xml/dom/pulldom.py @@ -55,7 +55,9 @@ def startElementNS(self, name, tagName , attrs): 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 @@ def startElement(self, name, attrs): 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 endElement(self, name): 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 comment(self, s): 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]