Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ae20722

Browse files
committed
Consider output encoding in XMLGenerator. Fixes #938076.
Backported to 2.3.
1 parent 0ea558f commit ae20722

1 file changed

Lines changed: 28 additions & 13 deletions

File tree

Lib/xml/sax/saxutils.py

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@
1212
except AttributeError:
1313
_StringTypes = [types.StringType]
1414

15+
# See whether the xmlcharrefreplace error handler is
16+
# supported
17+
try:
18+
from codecs import xmlcharrefreplace_errors
19+
_error_handling = "xmlcharrefreplace"
20+
del xmlcharrefreplace_errors
21+
except ImportError:
22+
_error_handling = "strict"
23+
1524
def __dict_replace(s, d):
1625
"""Replace substrings of a string using a dictionary."""
1726
for key, value in d.items():
@@ -83,10 +92,16 @@ def __init__(self, out=None, encoding="iso-8859-1"):
8392
self._undeclared_ns_maps = []
8493
self._encoding = encoding
8594

95+
def _write(self, text):
96+
if isinstance(text, str):
97+
self._out.write(text)
98+
else:
99+
self._out.write(text.encode(self._encoding, _error_handling))
100+
86101
# ContentHandler methods
87102

88103
def startDocument(self):
89-
self._out.write('<?xml version="1.0" encoding="%s"?>\n' %
104+
self._write('<?xml version="1.0" encoding="%s"?>\n' %
90105
self._encoding)
91106

92107
def startPrefixMapping(self, prefix, uri):
@@ -99,13 +114,13 @@ def endPrefixMapping(self, prefix):
99114
del self._ns_contexts[-1]
100115

101116
def startElement(self, name, attrs):
102-
self._out.write('<' + name)
117+
self._write('<' + name)
103118
for (name, value) in attrs.items():
104-
self._out.write(' %s=%s' % (name, quoteattr(value)))
105-
self._out.write('>')
119+
self._write(' %s=%s' % (name, quoteattr(value)))
120+
self._write('>')
106121

107122
def endElement(self, name):
108-
self._out.write('</%s>' % name)
123+
self._write('</%s>' % name)
109124

110125
def startElementNS(self, name, qname, attrs):
111126
if name[0] is None:
@@ -114,32 +129,32 @@ def startElementNS(self, name, qname, attrs):
114129
else:
115130
# else try to restore the original prefix from the namespace
116131
name = self._current_context[name[0]] + ":" + name[1]
117-
self._out.write('<' + name)
132+
self._write('<' + name)
118133

119134
for pair in self._undeclared_ns_maps:
120-
self._out.write(' xmlns:%s="%s"' % pair)
135+
self._write(' xmlns:%s="%s"' % pair)
121136
self._undeclared_ns_maps = []
122137

123138
for (name, value) in attrs.items():
124139
name = self._current_context[name[0]] + ":" + name[1]
125-
self._out.write(' %s=%s' % (name, quoteattr(value)))
126-
self._out.write('>')
140+
self._write(' %s=%s' % (name, quoteattr(value)))
141+
self._write('>')
127142

128143
def endElementNS(self, name, qname):
129144
if name[0] is None:
130145
name = name[1]
131146
else:
132147
name = self._current_context[name[0]] + ":" + name[1]
133-
self._out.write('</%s>' % name)
148+
self._write('</%s>' % name)
134149

135150
def characters(self, content):
136-
self._out.write(escape(content))
151+
self._write(escape(content))
137152

138153
def ignorableWhitespace(self, content):
139-
self._out.write(content)
154+
self._write(content)
140155

141156
def processingInstruction(self, target, data):
142-
self._out.write('<?%s %s?>' % (target, data))
157+
self._write('<?%s %s?>' % (target, data))
143158

144159

145160
class XMLFilterBase(xmlreader.XMLReader):

0 commit comments

Comments
 (0)