diff options
-rw-r--r-- | Lib/io.py | 8 | ||||
-rw-r--r-- | Lib/test/test_minidom.py | 14 | ||||
-rw-r--r-- | Lib/xml/dom/minidom.py | 23 |
3 files changed, 21 insertions, 24 deletions
@@ -1262,11 +1262,13 @@ class StringIO(TextIOWrapper): # XXX This is really slow, but fully functional - def __init__(self, initial_value=""): - super(StringIO, self).__init__(BytesIO(), "utf-8") + def __init__(self, initial_value="", encoding="utf-8", newline=None): + super(StringIO, self).__init__(BytesIO(), + encoding=encoding, + newline=newline) if initial_value: self.write(initial_value) self.seek(0) def getvalue(self): - return self.buffer.getvalue().decode("utf-8") + return self.buffer.getvalue().decode(self._encoding) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 9b61d1a..cc637d0 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -869,17 +869,17 @@ class MinidomTest(unittest.TestCase): def testEncodings(self): doc = parseString('<foo>€</foo>') - self.confirm(doc.toxml() == '<?xml version="1.0" ?><foo>\u20ac</foo>' - and doc.toxml('utf-8') == - '<?xml version="1.0" encoding="utf-8"?><foo>\xe2\x82\xac</foo>' - and doc.toxml('iso-8859-15') == - '<?xml version="1.0" encoding="iso-8859-15"?><foo>\xa4</foo>', - "testEncodings - encoding EURO SIGN") + self.assertEqual(doc.toxml(), + '<?xml version="1.0" ?><foo>\u20ac</foo>') + self.assertEqual(doc.toxml('utf-8'), + b'<?xml version="1.0" encoding="utf-8"?><foo>\xe2\x82\xac</foo>') + self.assertEqual(doc.toxml('iso-8859-15'), + b'<?xml version="1.0" encoding="iso-8859-15"?><foo>\xa4</foo>') # Verify that character decoding errors throw exceptions instead # of crashing self.assertRaises(UnicodeDecodeError, parseString, - '<fran\xe7ais>Comment \xe7a va ? Tr\xe8s bien ?</fran\xe7ais>') + b'<fran\xe7ais>Comment \xe7a va ? Tr\xe8s bien ?</fran\xe7ais>') doc.unlink() diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 3529bd3..d380022 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -14,6 +14,7 @@ Todo: * SAX 2 namespaces """ +import io import xml.dom from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg @@ -44,20 +45,19 @@ class Node(xml.dom.Node): def toxml(self, encoding = None): return self.toprettyxml("", "", encoding) - def toprettyxml(self, indent="\t", newl="\n", encoding = None): + def toprettyxml(self, indent="\t", newl="\n", encoding=None): # indent = the indentation string to prepend, per level # newl = the newline string to append - writer = _get_StringIO() - if encoding is not None: - import codecs - # Can't use codecs.getwriter to preserve 2.0 compatibility - writer = codecs.lookup(encoding)[3](writer) + writer = io.StringIO(encoding=encoding) if self.nodeType == Node.DOCUMENT_NODE: # Can pass encoding only to document, to put it into XML header self.writexml(writer, "", indent, newl, encoding) else: self.writexml(writer, "", indent, newl) - return writer.getvalue() + if encoding is None: + return writer.getvalue() + else: + return writer.buffer.getvalue() def hasChildNodes(self): if self.childNodes: @@ -360,7 +360,7 @@ class Attr(Node): def _get_localName(self): if 'localName' in self.__dict__: - return self.__dict__['localName'] + return self.__dict__['localName'] return self.nodeName.split(":", 1)[-1] def _get_name(self): @@ -665,7 +665,7 @@ class Element(Node): def _get_localName(self): if 'localName' in self.__dict__: - return self.__dict__['localName'] + return self.__dict__['localName'] return self.tagName.split(":", 1)[-1] def _get_tagName(self): @@ -1897,11 +1897,6 @@ def _nssplit(qualifiedName): return (None, fields[0]) -def _get_StringIO(): - # we can't use cStringIO since it doesn't support Unicode strings - from StringIO import StringIO - return StringIO() - def _do_pulldom_parse(func, args, kwargs): events = func(*args, **kwargs) toktype, rootNode = events.getEvent() |