]> granicus.if.org Git - python/commitdiff
bpo-34160: Preserve order of attributes in minidom. (GH-10219)
authorDiego Rojas <rojastorrado@gmail.com>
Wed, 7 Nov 2018 14:09:04 +0000 (09:09 -0500)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 7 Nov 2018 14:09:04 +0000 (16:09 +0200)
Doc/library/xml.dom.minidom.rst
Lib/test/test_minidom.py
Lib/xml/dom/minidom.py
Misc/NEWS.d/next/Library/2018-10-27-21-11-42.bpo-34160.UzyPZf.rst

index 40470e8736e7e436171f486c1500bf612bb220f0..a1f334d4178e436c03cab8f6a7d602c0a1e20c17 100644 (file)
@@ -143,6 +143,9 @@ module documentation.  This section lists the differences between the API and
    For the :class:`Document` node, an additional keyword argument *encoding* can
    be used to specify the encoding field of the XML header.
 
+   .. versionchanged:: 3.8
+      The :meth:`writexml` method now preserves the attribute order specified
+      by the user.
 
 .. method:: Node.toxml(encoding=None)
 
@@ -156,6 +159,10 @@ module documentation.  This section lists the differences between the API and
    encoding. Encoding this string in an encoding other than UTF-8 is
    likely incorrect, since UTF-8 is the default encoding of XML.
 
+   .. versionchanged:: 3.8
+      The :meth:`toxml` method now preserves the attribute order specified
+      by the user.
+
 .. method:: Node.toprettyxml(indent="", newl="", encoding="")
 
    Return a pretty-printed version of the document. *indent* specifies the
@@ -165,6 +172,10 @@ module documentation.  This section lists the differences between the API and
    The *encoding* argument behaves like the corresponding argument of
    :meth:`toxml`.
 
+   .. versionchanged:: 3.8
+      The :meth:`toprettyxml` method now preserves the attribute order specified
+      by the user.
+
 
 .. _dom-example:
 
index e91cdba1eb2eff0c20e50e9806a1ff74671dcb29..ad5be2f0f0e27328540e0145cb33d963e75771d3 100644 (file)
@@ -2,6 +2,8 @@
 
 import copy
 import pickle
+import io
+import contextlib
 from test.support import findfile
 import unittest
 
@@ -1560,5 +1562,24 @@ class MinidomTest(unittest.TestCase):
         pi = doc.createProcessingInstruction("y", "z")
         pi.nodeValue = "crash"
 
+    def test_minidom_attribute_order(self):
+        xml_str = '<?xml version="1.0" ?><curriculum status="public" company="example"/>'
+        doc = parseString(xml_str)
+        output = io.StringIO()
+        doc.writexml(output)
+        self.assertEqual(output.getvalue(), xml_str)
+
+    def test_toxml_with_attributes_ordered(self):
+        xml_str = '<?xml version="1.0" ?><curriculum status="public" company="example"/>'
+        doc = parseString(xml_str)
+        self.assertEqual(doc.toxml(), xml_str)
+
+    def test_toprettyxml_with_attributes_ordered(self):
+        xml_str = '<?xml version="1.0" ?><curriculum status="public" company="example"/>'
+        doc = parseString(xml_str)
+        self.assertEqual(doc.toprettyxml(),
+                         '<?xml version="1.0" ?>\n'
+                         '<curriculum status="public" company="example"/>\n')
+
 if __name__ == "__main__":
     unittest.main()
index e44e04a069ecb4db2b2698a4536f6f5656cea63b..469c51735e0385be403e55865dd05fd339985547 100644 (file)
@@ -854,9 +854,8 @@ class Element(Node):
         writer.write(indent+"<" + self.tagName)
 
         attrs = self._get_attributes()
-        a_names = sorted(attrs.keys())
 
-        for a_name in a_names:
+        for a_name in attrs.keys():
             writer.write(" %s=\"" % a_name)
             _write_data(writer, attrs[a_name].value)
             writer.write("\"")
index 6f3c076d3c0321f4eee5818b77f4e271eba723d4..775d33aacda7aa76460ef4db9cf2d80755906d19 100644 (file)
@@ -1 +1 @@
-ElementTree now preserves the attribute order specified by the user.
+ElementTree and minidom now preserve the attribute order specified by the user.