]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Consider output encoding in XMLGenerator. Fixes #938076.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 6 May 2004 02:22:23 +0000 (02:22 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 6 May 2004 02:22:23 +0000 (02:22 +0000)
Lib/xml/sax/saxutils.py
Misc/NEWS

index 4737d76aa03bd8dac112cf10e3b231c2d3536b1e..3402a02dadcc52b45284fb5ecfe84b6f5e35a486 100644 (file)
@@ -12,6 +12,15 @@ try:
 except AttributeError:
     _StringTypes = [types.StringType]
 
+# See whether the xmlcharrefreplace error handler is
+# supported
+try:
+    from codecs import xmlcharrefreplace_errors
+    _error_handling = "xmlcharrefreplace"
+    del xmlcharrefreplace_errors
+except ImportError:
+    _error_handling = "strict"
+
 def __dict_replace(s, d):
     """Replace substrings of a string using a dictionary."""
     for key, value in d.items():
@@ -83,10 +92,16 @@ class XMLGenerator(handler.ContentHandler):
         self._undeclared_ns_maps = []
         self._encoding = encoding
 
+    def _write(self, text):
+        if isinstance(text, str):
+            self._out.write(text)
+        else:
+            self._out.write(text.encode(self._encoding, _error_handling))
+
     # ContentHandler methods
 
     def startDocument(self):
-        self._out.write('<?xml version="1.0" encoding="%s"?>\n' %
+        self._write('<?xml version="1.0" encoding="%s"?>\n' %
                         self._encoding)
 
     def startPrefixMapping(self, prefix, uri):
@@ -99,13 +114,13 @@ class XMLGenerator(handler.ContentHandler):
         del self._ns_contexts[-1]
 
     def startElement(self, name, attrs):
-        self._out.write('<' + name)
+        self._write('<' + name)
         for (name, value) in attrs.items():
-            self._out.write(' %s=%s' % (name, quoteattr(value)))
-        self._out.write('>')
+            self._write(' %s=%s' % (name, quoteattr(value)))
+        self._write('>')
 
     def endElement(self, name):
-        self._out.write('</%s>' % name)
+        self._write('</%s>' % name)
 
     def startElementNS(self, name, qname, attrs):
         if name[0] is None:
@@ -114,32 +129,32 @@ class XMLGenerator(handler.ContentHandler):
         else:
             # else try to restore the original prefix from the namespace
             name = self._current_context[name[0]] + ":" + name[1]
-        self._out.write('<' + name)
+        self._write('<' + name)
 
         for pair in self._undeclared_ns_maps:
-            self._out.write(' xmlns:%s="%s"' % pair)
+            self._write(' xmlns:%s="%s"' % pair)
         self._undeclared_ns_maps = []
 
         for (name, value) in attrs.items():
             name = self._current_context[name[0]] + ":" + name[1]
-            self._out.write(' %s=%s' % (name, quoteattr(value)))
-        self._out.write('>')
+            self._write(' %s=%s' % (name, quoteattr(value)))
+        self._write('>')
 
     def endElementNS(self, name, qname):
         if name[0] is None:
             name = name[1]
         else:
             name = self._current_context[name[0]] + ":" + name[1]
-        self._out.write('</%s>' % name)
+        self._write('</%s>' % name)
 
     def characters(self, content):
-        self._out.write(escape(content))
+        self._write(escape(content))
 
     def ignorableWhitespace(self, content):
-        self._out.write(content)
+        self._write(content)
 
     def processingInstruction(self, target, data):
-        self._out.write('<?%s %s?>' % (target, data))
+        self._write('<?%s %s?>' % (target, data))
 
 
 class XMLFilterBase(xmlreader.XMLReader):
index 8319ae0af5685757fbb25d603fc403c69cb7263c..c422b227bb836c0b1d4d219940aba280542e58ef 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -42,6 +42,8 @@ Core and builtins
 Library
 -------
 
+- Bug #938076: Consider output encoding in XMLGenerator.
+
 - Bug #936637: Properly delegate startElementNS in saxutils.XMLFilterBase.
 
 - Bug #944082: Empty passwords in urllib2 are now supported.