mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
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:
parent
269b83bc05
commit
b417be2ad9
2 changed files with 47 additions and 19 deletions
|
@ -651,7 +651,14 @@ class DOMImplementation:
|
||||||
doc = Document()
|
doc = Document()
|
||||||
if doctype is None:
|
if doctype is None:
|
||||||
doctype = self.createDocumentType(qualifiedName, None, 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)
|
prefix, localname = _nssplit(qualifiedName)
|
||||||
if prefix == "xml" \
|
if prefix == "xml" \
|
||||||
and namespaceURI != "http://www.w3.org/XML/1998/namespace":
|
and namespaceURI != "http://www.w3.org/XML/1998/namespace":
|
||||||
|
@ -661,7 +668,6 @@ class DOMImplementation:
|
||||||
"illegal use of prefix without namespaces")
|
"illegal use of prefix without namespaces")
|
||||||
element = doc.createElementNS(namespaceURI, qualifiedName)
|
element = doc.createElementNS(namespaceURI, qualifiedName)
|
||||||
doc.appendChild(element)
|
doc.appendChild(element)
|
||||||
# XXX else, raise an error? Empty qname is illegal in the DOM spec!
|
|
||||||
doctype.parentNode = doc
|
doctype.parentNode = doc
|
||||||
doc.doctype = doctype
|
doc.doctype = doctype
|
||||||
doc.implementation = self
|
doc.implementation = self
|
||||||
|
@ -761,6 +767,7 @@ def _doparse(func, args, kwargs):
|
||||||
events = apply(func, args, kwargs)
|
events = apply(func, args, kwargs)
|
||||||
toktype, rootNode = events.getEvent()
|
toktype, rootNode = events.getEvent()
|
||||||
events.expandNode(rootNode)
|
events.expandNode(rootNode)
|
||||||
|
events.clear()
|
||||||
return rootNode
|
return rootNode
|
||||||
|
|
||||||
def parse(*args, **kwargs):
|
def parse(*args, **kwargs):
|
||||||
|
|
|
@ -61,11 +61,17 @@ class PullDOM(xml.sax.ContentHandler):
|
||||||
tagName = prefix + ":" + localname
|
tagName = prefix + ":" + localname
|
||||||
else:
|
else:
|
||||||
tagName = localname
|
tagName = localname
|
||||||
|
if self.document:
|
||||||
node = self.document.createElementNS(uri, tagName)
|
node = self.document.createElementNS(uri, tagName)
|
||||||
|
else:
|
||||||
|
node = self.buildDocument(uri, tagName)
|
||||||
else:
|
else:
|
||||||
# When the tagname is not prefixed, it just appears as
|
# When the tagname is not prefixed, it just appears as
|
||||||
# localname
|
# localname
|
||||||
|
if self.document:
|
||||||
node = self.document.createElement(localname)
|
node = self.document.createElement(localname)
|
||||||
|
else:
|
||||||
|
node = self.buildDocument(None, localname)
|
||||||
|
|
||||||
for aname,value in attrs.items():
|
for aname,value in attrs.items():
|
||||||
a_uri, a_localname = aname
|
a_uri, a_localname = aname
|
||||||
|
@ -90,7 +96,10 @@ class PullDOM(xml.sax.ContentHandler):
|
||||||
self.lastEvent = self.lastEvent[1]
|
self.lastEvent = self.lastEvent[1]
|
||||||
|
|
||||||
def startElement(self, name, attrs):
|
def startElement(self, name, attrs):
|
||||||
|
if self.document:
|
||||||
node = self.document.createElement(name)
|
node = self.document.createElement(name)
|
||||||
|
else:
|
||||||
|
node = self.buildDocument(None, name)
|
||||||
|
|
||||||
for aname,value in attrs.items():
|
for aname,value in attrs.items():
|
||||||
attr = self.document.createAttribute(aname)
|
attr = self.document.createAttribute(aname)
|
||||||
|
@ -127,23 +136,28 @@ class PullDOM(xml.sax.ContentHandler):
|
||||||
self.lastEvent = self.lastEvent[1]
|
self.lastEvent = self.lastEvent[1]
|
||||||
|
|
||||||
def startDocument(self):
|
def startDocument(self):
|
||||||
publicId = systemId = None
|
|
||||||
if self._locator:
|
|
||||||
publicId = self._locator.getPublicId()
|
|
||||||
systemId = self._locator.getSystemId()
|
|
||||||
if self.documentFactory is None:
|
if self.documentFactory is None:
|
||||||
import xml.dom.minidom
|
import xml.dom.minidom
|
||||||
self.documentFactory = xml.dom.minidom.Document.implementation
|
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.document = node
|
||||||
self.lastEvent[1] = [(START_DOCUMENT, node), None]
|
self.lastEvent[1] = [(START_DOCUMENT, node), None]
|
||||||
self.lastEvent = self.lastEvent[1]
|
self.lastEvent = self.lastEvent[1]
|
||||||
self.push(node)
|
self.push(node)
|
||||||
|
return node.firstChild
|
||||||
|
|
||||||
def endDocument(self):
|
def endDocument(self):
|
||||||
self.lastEvent[1] = [(END_DOCUMENT, self.document), None]
|
self.lastEvent[1] = [(END_DOCUMENT, self.document), None]
|
||||||
self.pop()
|
self.pop()
|
||||||
|
|
||||||
|
def clear(self):
|
||||||
|
"clear(): Explicitly release parsing structures"
|
||||||
|
self.document = None
|
||||||
|
|
||||||
class ErrorHandler:
|
class ErrorHandler:
|
||||||
def warning(self, exception):
|
def warning(self, exception):
|
||||||
print exception
|
print exception
|
||||||
|
@ -199,6 +213,13 @@ class DOMEventStream:
|
||||||
self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1]
|
self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1]
|
||||||
return rc
|
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):
|
class SAX2DOM(PullDOM):
|
||||||
|
|
||||||
def startElementNS(self, name, tagName , attrs):
|
def startElementNS(self, name, tagName , attrs):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue