[Python-checkins] CVS: python/dist/src/Lib/xml/dom pulldom.py,1.6,1.7
Martin v. Löwis
python-dev@python.org
Sun, 24 Sep 2000 14:54:17 -0700
Update of /cvsroot/python/python/dist/src/Lib/xml/dom
In directory slayer.i.sourceforge.net:/tmp/cvs-serv14877
Modified Files:
pulldom.py
Log Message:
Use SAX2 namespace support.
Index: pulldom.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/xml/dom/pulldom.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** pulldom.py 2000/09/24 18:31:37 1.6
--- pulldom.py 2000/09/24 21:54:14 1.7
***************
*** 1,7 ****
import minidom
! import xml.sax
- #todo: namespace handling
-
START_ELEMENT = "START_ELEMENT"
END_ELEMENT = "END_ELEMENT"
--- 1,5 ----
import minidom
! import xml.sax,xml.sax.handler
START_ELEMENT = "START_ELEMENT"
END_ELEMENT = "END_ELEMENT"
***************
*** 13,32 ****
CHARACTERS = "CHARACTERS"
! class PullDOM:
def __init__(self):
self.firstEvent = [None, None]
self.lastEvent = self.firstEvent
def setDocumentLocator(self, locator): pass
-
- def startElement(self, name, attrs):
- if not hasattr(self, "curNode"):
- # FIXME: hack!
- self.startDocument()
-
- node = self.document.createElement(name)
- for (attr, value) in attrs.items():
- node.setAttribute(attr, attrs[attr])
parent = self.curNode
node.parentNode = parent
--- 11,52 ----
CHARACTERS = "CHARACTERS"
! class PullDOM(xml.sax.ContentHandler):
def __init__(self):
self.firstEvent = [None, None]
self.lastEvent = self.firstEvent
+ self._ns_contexts = [{}] # contains uri -> prefix dicts
+ self._current_context = self._ns_contexts[-1]
def setDocumentLocator(self, locator): pass
+ def startPrefixMapping(self, prefix, uri):
+ self._ns_contexts.append(self._current_context.copy())
+ self._current_context[uri] = prefix
+
+ def endPrefixMapping(self, prefix):
+ del self._ns_contexts[-1]
+
+ def startElementNS(self, name, tagName , attrs):
+ if name[0]:
+ # When using namespaces, the reader may or may not
+ # provide us with the original name. If not, create
+ # *a* valid tagName from the current context.
+ if tagName is None:
+ tagName = self._current_context[name[0]] + ":" + name[1]
+ node = self.document.createElementNS(name[0], tagName)
+ else:
+ # When the tagname is not prefixed, it just appears as
+ # name[1]
+ node = self.document.createElement(name[1])
+
+ for aname,value in attrs.items():
+ if aname[0]:
+ qname = self._current_context[name[0]] + ":" + aname[1]
+ attr = self.document.createAttributeNS(name[0], qname)
+ else:
+ attr = self.document.createAttribute(name[0], name[1])
+ attr.value = value
+ node.setAttributeNode(qname, attr)
+
parent = self.curNode
node.parentNode = parent
***************
*** 40,44 ****
#self.events.append((START_ELEMENT, node))
! def endElement(self, name):
node = self.curNode
self.lastEvent[1] = [(END_ELEMENT, node), None]
--- 60,64 ----
#self.events.append((START_ELEMENT, node))
! def endElementNS(self, name, tagName):
node = self.curNode
self.lastEvent[1] = [(END_ELEMENT, node), None]
***************
*** 123,126 ****
--- 143,148 ----
def reset(self):
self.pulldom = PullDOM()
+ # This content handler relies on namespace support
+ self.parser.setFeature(xml.sax.handler.feature_namespaces,1)
self.parser.setContentHandler(self.pulldom)
***************
*** 155,170 ****
return rc
- # FIXME: sax2
- #def _getParser( ):
- # from xml.sax.saxexts import make_parser
- # expat doesn't report errors properly! Figure it out
- # return make_parser()
- # return make_parser("xml.sax.drivers.drv_xmllib")
-
-
-
- def _getParser():
- return xml.sax.make_parser()
-
default_bufsize = (2 ** 14) - 20
--- 177,180 ----
***************
*** 176,180 ****
stream = stream_or_string
if not parser:
! parser = _getParser()
return DOMEventStream(stream, parser, bufsize)
--- 186,190 ----
stream = stream_or_string
if not parser:
! parser = xml.sax.make_parser()
return DOMEventStream(stream, parser, bufsize)
***************
*** 187,190 ****
bufsize = len(string)
buf = StringIO(string)
! parser = _getParser()
return DOMEventStream(buf, parser, bufsize)
--- 197,201 ----
bufsize = len(string)
buf = StringIO(string)
! if not parser:
! parser = xml.sax.make_parser()
return DOMEventStream(buf, parser, bufsize)