summaryrefslogtreecommitdiffstats
path: root/Lib/xml/dom
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2001-02-06 01:16:06 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2001-02-06 01:16:06 (GMT)
commitb417be2ad9c4d4d7ab9d682f71c771de37a48dcc (patch)
tree5d0261a33c1beffb4d56908de64c5c1fb6643628 /Lib/xml/dom
parent269b83bc05452f4f54fa9df5a76608f88da544fe (diff)
downloadcpython-b417be2ad9c4d4d7ab9d682f71c771de37a48dcc.zip
cpython-b417be2ad9c4d4d7ab9d682f71c771de37a48dcc.tar.gz
cpython-b417be2ad9c4d4d7ab9d682f71c771de37a48dcc.tar.bz2
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.
Diffstat (limited to 'Lib/xml/dom')
-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):