[XML-SIG] unicode data

Martin v. Loewis martin@loewis.home.cs.tu-berlin.de
Fri, 3 Nov 2000 10:30:08 +0100


> I have an wxPython application that stores configuration info and meta
> data in xml.  I hold this xml data in a dom for easy use.  I pass a lot
> of data to wxPython functions calls that require string types.  Now all
> those calls (a lot) raise a TypError.  

I see. It would be possible to wrap all data with str(), but that is
probably not an acceptable solution; in the long run, wxPython should
be taught to accept Unicode objects (one primary reason to introduce
Unicode is to display it to the user, after all).

> How do I use a different driver? This is how I get my dom:
> 
> from xml.dom.ext.reader import Sax
> doc = Sax.FromXml(s,ownerDocument)

Good question, with no satisfying answer, at the moment. I envision an
API where you say

from xml.dom.saxexts import make_parser
p = parser.make_parser("xml.sax.drivers.drv_sgmlop") # that works today
doc = Sax.FromXml(s,ownerDocument,parser=p)

The last part doesn't work, yet - please try the patch I've attached
below; I'd like to ship that with 0.6.2 unless I get an update of 4DOM
that solves this in a different way.

With 0.6.1, your only option is to set the environment variable
PY_SAX_PARSER to xml.sax.drivers.drv_sgmlop.

Regards,
Martin

Index: Sax.py
===================================================================
RCS file: /cvsroot/pyxml/xml/xml/dom/ext/reader/Sax.py,v
retrieving revision 1.4
diff -u -r1.4 Sax.py
--- Sax.py	2000/10/02 17:57:44	1.4
+++ Sax.py	2000/11/03 09:25:17
@@ -116,9 +116,10 @@
                   validate=0,
                   keepAllWs=0,
                   catName=None,
-                  saxHandlerClass=XmlDomGenerator):
+                  saxHandlerClass=XmlDomGenerator,
+                  parser = None):
     #Create an XML DOM from SAX events
-    parser = (validate and saxexts.XMLValParserFactory.make_parser()) or  saxexts.XMLParserFactory.make_parser()
+    parser = parser or (validate and saxexts.XMLValParserFactory.make_parser()) or  saxexts.XMLParserFactory.make_parser()
     if catName:
         #set up the catalog, if there is one
         from xml.parsers.xmlproc import catalog
@@ -137,9 +138,10 @@
             validate=0,
             keepAllWs=0,
             catName=None,
-            saxHandlerClass=XmlDomGenerator):
+            saxHandlerClass=XmlDomGenerator,
+            parser=None):
     fp = cStringIO.StringIO(str)
-    rv = FromXmlStream(fp,ownerDocument,validate,keepAllWs,catName,saxHandlerClass)
+    rv = FromXmlStream(fp,ownerDocument,validate,keepAllWs,catName,saxHandlerClass,parser)
     return rv
 
 def FromXmlFile(fileName,
@@ -147,9 +149,10 @@
                 validate=0,
                 keepAllWs=0,
                 catName=None,
-                saxHandlerClass=XmlDomGenerator):
+                saxHandlerClass=XmlDomGenerator,
+                parser=None):
     fp = open(fileName, 'r')
-    rv = FromXmlStream(fp,ownerDocument,validate,keepAllWs,catName,saxHandlerClass)
+    rv = FromXmlStream(fp,ownerDocument,validate,keepAllWs,catName,saxHandlerClass,parser)
     fp.close()
     return rv
 
@@ -158,10 +161,11 @@
                validate=0,
                keepAllWs=0,
                catName=None,
-               saxHandlerClass=XmlDomGenerator):
+               saxHandlerClass=XmlDomGenerator,
+               parser=None):
     import urllib
     fp = urllib.urlopen(url)
-    rv = FromXmlStream(fp,ownerDocument,validate,keepAllWs,catName,saxHandlerClass)
+    rv = FromXmlStream(fp,ownerDocument,validate,keepAllWs,catName,saxHandlerClass,parser)
     fp.close()
     return rv