mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
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 d7db9dc3cc
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
86eb500068
commit
6fe7e0264f
3 changed files with 10 additions and 20 deletions
|
@ -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>ø</site>'''))
|
||||
self.assertEqual(f.read(), b'''<site>ø</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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Suppress writing an XML declaration in open files in ``ElementTree.write()``
|
||||
with ``encoding='unicode'`` and ``xml_declaration=None``.
|
Loading…
Add table
Add a link
Reference in a new issue