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.
This commit is contained in:
Martin v. Löwis 2001-02-06 01:16:06 +00:00
parent 269b83bc05
commit b417be2ad9
2 changed files with 47 additions and 19 deletions

View file

@ -651,7 +651,14 @@ class DOMImplementation:
doc = Document()
if doctype is None:
doctype = self.createDocumentType(qualifiedName, None, None)
if qualifiedName:
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":
@ -661,7 +668,6 @@ class DOMImplementation:
"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!
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):

View file

@ -61,11 +61,17 @@ class PullDOM(xml.sax.ContentHandler):
tagName = prefix + ":" + localname
else:
tagName = localname
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
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):
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):