diff -r 5fea362b92fc Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py Wed Apr 25 19:45:11 2012 +0200 +++ b/Lib/xml/etree/ElementTree.py Fri Apr 27 23:41:08 2012 +0300 @@ -100,6 +100,7 @@ import sys import re import warnings +import io class _SimpleElementPath: # emulate pre-1.2 find/findtext/findall behaviour @@ -834,17 +835,24 @@ else: encoding = encoding.lower() if hasattr(file_or_filename, "write"): - file = file_or_filename + if encoding != "unicode": + file = io.TextIOWrapper(file_or_filename, encoding=encoding, + errors="xmlcharrefreplace", + write_through=True) + else: + file = file_or_filename + close_file = False else: if encoding != "unicode": - file = open(file_or_filename, "wb") + file = open(file_or_filename, "w", encoding=encoding, + errors="xmlcharrefreplace") else: file = open(file_or_filename, "w") + close_file = True if encoding != "unicode": def write(text): try: - return file.write(text.encode(encoding, - "xmlcharrefreplace")) + return file.write(text) except (TypeError, AttributeError): _raise_serialization_error(text) else: @@ -864,8 +872,10 @@ qnames, namespaces = _namespaces(self._root, default_namespace) serialize = _serialize[method] serialize(write, self._root, qnames, namespaces) - if file_or_filename is not file: + if close_file: file.close() + elif file_or_filename is not file: + file.detach() def write_c14n(self, file): # lxml.etree compatibility. use output method instead @@ -1159,11 +1169,10 @@ # @defreturn string def tostring(element, encoding=None, method=None): - class dummy: - pass data = [] - file = dummy() + file = io.BufferedIOBase() file.write = data.append + file.writable = lambda: True ElementTree(element).write(file, encoding, method=method) if encoding in (str, "unicode"): return "".join(data) @@ -1186,11 +1195,10 @@ # @since 1.3 def tostringlist(element, encoding=None, method=None): - class dummy: - pass data = [] - file = dummy() + file = io.BufferedIOBase() file.write = data.append + file.writable = lambda: True ElementTree(element).write(file, encoding, method=method) # FIXME: merge small fragments into larger parts return data