bpo-34160: Preserve order of attributes in minidom. (GH-10219)

This commit is contained in:
Diego Rojas 2018-11-07 09:09:04 -05:00 committed by Serhiy Storchaka
parent f194479949
commit 5598cc90c7
4 changed files with 34 additions and 3 deletions

View 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:

View 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()

View 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("\"")

View 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.