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.
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 @@
         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 @@
     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 @@
                     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 @@
         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 @@
         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 @@
         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):