diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2004-05-06 02:22:43 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2004-05-06 02:22:43 (GMT) |
commit | ae20722d9619f0e2128d5e23f68c3d64db961bfd (patch) | |
tree | c5624ec7e878bda45bbb5c2322e869621a31930a | |
parent | 0ea558f7b4b6242a7457cf6a20ad33cf2769b7b1 (diff) | |
download | cpython-ae20722d9619f0e2128d5e23f68c3d64db961bfd.zip cpython-ae20722d9619f0e2128d5e23f68c3d64db961bfd.tar.gz cpython-ae20722d9619f0e2128d5e23f68c3d64db961bfd.tar.bz2 |
Consider output encoding in XMLGenerator. Fixes #938076.
Backported to 2.3.
-rw-r--r-- | Lib/xml/sax/saxutils.py | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py index 4737d76..3402a02 100644 --- a/Lib/xml/sax/saxutils.py +++ b/Lib/xml/sax/saxutils.py @@ -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): |