summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2022-06-14 04:25:33 (GMT)
committerGitHub <noreply@github.com>2022-06-14 04:25:33 (GMT)
commitd7db9dc3cc5b44d0b4ce000571fecf58089a01ec (patch)
treecc636ef403b128d3d7786e3885a9aa68e7e6ca15
parent8352e322e87ba39c71e578b65ad8ae156ca3e0c7 (diff)
downloadcpython-d7db9dc3cc5b44d0b4ce000571fecf58089a01ec.zip
cpython-d7db9dc3cc5b44d0b4ce000571fecf58089a01ec.tar.gz
cpython-d7db9dc3cc5b44d0b4ce000571fecf58089a01ec.tar.bz2
gh-91810: Fix regression with writing an XML declaration with encoding='unicode' (GH-93426)
Suppress writing an XML declaration in open files in ElementTree.write() with encoding='unicode' and xml_declaration=None. If file patch is passed to ElementTree.write() with encoding='unicode', always open a new file in UTF-8.
-rw-r--r--Lib/test/test_xml_etree.py16
-rw-r--r--Lib/xml/etree/ElementTree.py12
-rw-r--r--Misc/NEWS.d/next/Library/2022-06-02-08-40-58.gh-issue-91810.Gtk44w.rst2
3 files changed, 10 insertions, 20 deletions
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index aea77b1..afa4641 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -3739,13 +3739,7 @@ class IOTest(unittest.TestCase):
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
tree.write(TESTFN, encoding='unicode')
with open(TESTFN, 'rb') as f:
- data = f.read()
- expected = "<site>\xf8</site>".encode(encoding, 'xmlcharrefreplace')
- if encoding.lower() in ('utf-8', 'ascii'):
- self.assertEqual(data, expected)
- else:
- self.assertIn(b"<?xml version='1.0' encoding=", data)
- self.assertIn(expected, data)
+ self.assertEqual(f.read(), b"<site>\xc3\xb8</site>")
def test_write_to_text_file(self):
self.addCleanup(os_helper.unlink, TESTFN)
@@ -3760,17 +3754,13 @@ class IOTest(unittest.TestCase):
tree.write(f, encoding='unicode')
self.assertFalse(f.closed)
with open(TESTFN, 'rb') as f:
- self.assertEqual(f.read(), convlinesep(
- b'''<?xml version='1.0' encoding='ascii'?>\n'''
- b'''<site>&#248;</site>'''))
+ self.assertEqual(f.read(), b'''<site>&#248;</site>''')
with open(TESTFN, 'w', encoding='ISO-8859-1') as f:
tree.write(f, encoding='unicode')
self.assertFalse(f.closed)
with open(TESTFN, 'rb') as f:
- self.assertEqual(f.read(), convlinesep(
- b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n'''
- b'''<site>\xf8</site>'''))
+ self.assertEqual(f.read(), b'''<site>\xf8</site>''')
def test_write_to_binary_file(self):
self.addCleanup(os_helper.unlink, TESTFN)
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index a5cc65e..1dc8035 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -731,6 +731,7 @@ class ElementTree:
with _get_writer(file_or_filename, encoding) as (write, declared_encoding):
if method == "xml" and (xml_declaration or
(xml_declaration is None and
+ encoding.lower() != "unicode" and
declared_encoding.lower() not in ("utf-8", "us-ascii"))):
write("<?xml version='1.0' encoding='%s'?>\n" % (
declared_encoding,))
@@ -757,13 +758,10 @@ def _get_writer(file_or_filename, encoding):
except AttributeError:
# file_or_filename is a file name
if encoding.lower() == "unicode":
- file = open(file_or_filename, "w",
- errors="xmlcharrefreplace")
- else:
- file = open(file_or_filename, "w", encoding=encoding,
- errors="xmlcharrefreplace")
- with file:
- yield file.write, file.encoding
+ encoding="utf-8"
+ with open(file_or_filename, "w", encoding=encoding,
+ errors="xmlcharrefreplace") as file:
+ yield file.write, encoding
else:
# file_or_filename is a file-like object
# encoding determines if it is a text or binary writer
diff --git a/Misc/NEWS.d/next/Library/2022-06-02-08-40-58.gh-issue-91810.Gtk44w.rst b/Misc/NEWS.d/next/Library/2022-06-02-08-40-58.gh-issue-91810.Gtk44w.rst
new file mode 100644
index 0000000..e400058
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-06-02-08-40-58.gh-issue-91810.Gtk44w.rst
@@ -0,0 +1,2 @@
+Suppress writing an XML declaration in open files in ``ElementTree.write()``
+with ``encoding='unicode'`` and ``xml_declaration=None``.