summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/xml/dom/minidom.py29
-rw-r--r--Lib/xml/dom/pulldom.py37
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):