Skip to content

Commit 6fe7e02

Browse files
gh-91810: Fix regression with writing an XML declaration with encoding='unicode' (GH-93426) (GH-93793)
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. (cherry picked from commit d7db9dc) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent 86eb500 commit 6fe7e02

File tree

3 files changed

+10
-20
lines changed

3 files changed

+10
-20
lines changed

Lib/test/test_xml_etree.py

+3-13
Original file line numberDiff line numberDiff line change
@@ -3739,13 +3739,7 @@ def test_write_to_filename_as_unicode(self):
37393739
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
37403740
tree.write(TESTFN, encoding='unicode')
37413741
with open(TESTFN, 'rb') as f:
3742-
data = f.read()
3743-
expected = "<site>\xf8</site>".encode(encoding, 'xmlcharrefreplace')
3744-
if encoding.lower() in ('utf-8', 'ascii'):
3745-
self.assertEqual(data, expected)
3746-
else:
3747-
self.assertIn(b"<?xml version='1.0' encoding=", data)
3748-
self.assertIn(expected, data)
3742+
self.assertEqual(f.read(), b"<site>\xc3\xb8</site>")
37493743

37503744
def test_write_to_text_file(self):
37513745
self.addCleanup(os_helper.unlink, TESTFN)
@@ -3760,17 +3754,13 @@ def test_write_to_text_file(self):
37603754
tree.write(f, encoding='unicode')
37613755
self.assertFalse(f.closed)
37623756
with open(TESTFN, 'rb') as f:
3763-
self.assertEqual(f.read(), convlinesep(
3764-
b'''<?xml version='1.0' encoding='ascii'?>\n'''
3765-
b'''<site>&#248;</site>'''))
3757+
self.assertEqual(f.read(), b'''<site>&#248;</site>''')
37663758

37673759
with open(TESTFN, 'w', encoding='ISO-8859-1') as f:
37683760
tree.write(f, encoding='unicode')
37693761
self.assertFalse(f.closed)
37703762
with open(TESTFN, 'rb') as f:
3771-
self.assertEqual(f.read(), convlinesep(
3772-
b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n'''
3773-
b'''<site>\xf8</site>'''))
3763+
self.assertEqual(f.read(), b'''<site>\xf8</site>''')
37743764

37753765
def test_write_to_binary_file(self):
37763766
self.addCleanup(os_helper.unlink, TESTFN)

Lib/xml/etree/ElementTree.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@ def write(self, file_or_filename,
731731
with _get_writer(file_or_filename, encoding) as (write, declared_encoding):
732732
if method == "xml" and (xml_declaration or
733733
(xml_declaration is None and
734+
encoding.lower() != "unicode" and
734735
declared_encoding.lower() not in ("utf-8", "us-ascii"))):
735736
write("<?xml version='1.0' encoding='%s'?>\n" % (
736737
declared_encoding,))
@@ -757,13 +758,10 @@ def _get_writer(file_or_filename, encoding):
757758
except AttributeError:
758759
# file_or_filename is a file name
759760
if encoding.lower() == "unicode":
760-
file = open(file_or_filename, "w",
761-
errors="xmlcharrefreplace")
762-
else:
763-
file = open(file_or_filename, "w", encoding=encoding,
764-
errors="xmlcharrefreplace")
765-
with file:
766-
yield file.write, file.encoding
761+
encoding="utf-8"
762+
with open(file_or_filename, "w", encoding=encoding,
763+
errors="xmlcharrefreplace") as file:
764+
yield file.write, encoding
767765
else:
768766
# file_or_filename is a file-like object
769767
# encoding determines if it is a text or binary writer
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Suppress writing an XML declaration in open files in ``ElementTree.write()``
2+
with ``encoding='unicode'`` and ``xml_declaration=None``.

0 commit comments

Comments
 (0)