From b417be2ad9c4d4d7ab9d682f71c771de37a48dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Tue, 6 Feb 2001 01:16:06 +0000 Subject: Do not allow empty qualifiedName in createDocument. Rearrange pulldom to create documents with root element. Provide clear methods so that the ContentHandler releases its hold on the document. --- Lib/xml/dom/minidom.py | 29 ++++++++++++++++++----------- Lib/xml/dom/pulldom.py | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index b026fbb..ef1a2bf 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -651,17 +651,23 @@ class DOMImplementation: doc = Document() if doctype is None: doctype = self.createDocumentType(qualifiedName, None, None) - if qualifiedName: - prefix, localname = _nssplit(qualifiedName) - if prefix == "xml" \ - and namespaceURI != "http://www.w3.org/XML/1998/namespace": - raise xml.dom.NamespaceErr("illegal use of 'xml' prefix") - if prefix and not namespaceURI: - raise xml.dom.NamespaceErr( - "illegal use of prefix without namespaces") - element = doc.createElementNS(namespaceURI, qualifiedName) - doc.appendChild(element) - # XXX else, raise an error? Empty qname is illegal in the DOM spec! + if not qualifiedName: + # The spec is unclear what to raise here; SyntaxErr + # would be the other obvious candidate. Since Xerces raises + # InvalidCharacterErr, and since SyntaxErr is not listed + # for createDocument, that seems to be the better choice. + # XXX: need to check for illegal characters here and in + # createElement. + raise xml.dom.InvalidCharacterErr("Element with no name") + prefix, localname = _nssplit(qualifiedName) + if prefix == "xml" \ + and namespaceURI != "http://www.w3.org/XML/1998/namespace": + raise xml.dom.NamespaceErr("illegal use of 'xml' prefix") + if prefix and not namespaceURI: + raise xml.dom.NamespaceErr( + "illegal use of prefix without namespaces") + element = doc.createElementNS(namespaceURI, qualifiedName) + doc.appendChild(element) doctype.parentNode = doc doc.doctype = doctype doc.implementation = self @@ -761,6 +767,7 @@ def _doparse(func, args, kwargs): events = apply(func, args, kwargs) toktype, rootNode = events.getEvent() events.expandNode(rootNode) + events.clear() return rootNode def parse(*args, **kwargs): diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py index c400742..b573ba0 100644 --- a/Lib/xml/dom/pulldom.py +++ b/Lib/xml/dom/pulldom.py @@ -61,11 +61,17 @@ class PullDOM(xml.sax.ContentHandler): tagName = prefix + ":" + localname else: tagName = localname - node = self.document.createElementNS(uri, tagName) + if self.document: + node = self.document.createElementNS(uri, tagName) + else: + node = self.buildDocument(uri, tagName) else: # When the tagname is not prefixed, it just appears as # localname - node = self.document.createElement(localname) + if self.document: + node = self.document.createElement(localname) + else: + node = self.buildDocument(None, localname) for aname,value in attrs.items(): a_uri, a_localname = aname @@ -90,7 +96,10 @@ class PullDOM(xml.sax.ContentHandler): self.lastEvent = self.lastEvent[1] def startElement(self, name, attrs): - node = self.document.createElement(name) + if self.document: + node = self.document.createElement(name) + else: + node = self.buildDocument(None, name) for aname,value in attrs.items(): attr = self.document.createAttribute(aname) @@ -127,23 +136,28 @@ class PullDOM(xml.sax.ContentHandler): self.lastEvent = self.lastEvent[1] def startDocument(self): - publicId = systemId = None - if self._locator: - publicId = self._locator.getPublicId() - systemId = self._locator.getSystemId() if self.documentFactory is None: import xml.dom.minidom self.documentFactory = xml.dom.minidom.Document.implementation - node = self.documentFactory.createDocument(None, publicId, systemId) + + def buildDocument(self, uri, tagname): + # Can't do that in startDocument, since we need the tagname + # XXX: obtain DocumentType + node = self.documentFactory.createDocument(uri, tagname, None) self.document = node self.lastEvent[1] = [(START_DOCUMENT, node), None] self.lastEvent = self.lastEvent[1] self.push(node) + return node.firstChild def endDocument(self): self.lastEvent[1] = [(END_DOCUMENT, self.document), None] self.pop() + def clear(self): + "clear(): Explicitly release parsing structures" + self.document = None + class ErrorHandler: def warning(self, exception): print exception @@ -199,6 +213,13 @@ class DOMEventStream: self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1] return rc + def clear(self): + "clear(): Explicitly release parsing objects" + self.pulldom.clear() + del self.pulldom + self.parser = None + self.stream = None + class SAX2DOM(PullDOM): def startElementNS(self, name, tagName , attrs): -- cgit v0.12