[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)