1212except 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+
1524def __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
145160class XMLFilterBase (xmlreader .XMLReader ):
0 commit comments