mirror of https://github.com/python/cpython
gh-50002: xml.dom.minidom now preserves whitespaces in attributes (GH-107947)
Also double quotes (") are now only quoted in attributes.
This commit is contained in:
parent
29bc6165ab
commit
154477be72
|
@ -505,6 +505,46 @@ class MinidomTest(unittest.TestCase):
|
|||
dom.unlink()
|
||||
self.confirm(str == domstr)
|
||||
|
||||
def test_toxml_quote_text(self):
|
||||
dom = Document()
|
||||
elem = dom.appendChild(dom.createElement('elem'))
|
||||
elem.appendChild(dom.createTextNode('&<>"'))
|
||||
cr = elem.appendChild(dom.createElement('cr'))
|
||||
cr.appendChild(dom.createTextNode('\r'))
|
||||
crlf = elem.appendChild(dom.createElement('crlf'))
|
||||
crlf.appendChild(dom.createTextNode('\r\n'))
|
||||
lflf = elem.appendChild(dom.createElement('lflf'))
|
||||
lflf.appendChild(dom.createTextNode('\n\n'))
|
||||
ws = elem.appendChild(dom.createElement('ws'))
|
||||
ws.appendChild(dom.createTextNode('\t\n\r '))
|
||||
domstr = dom.toxml()
|
||||
dom.unlink()
|
||||
self.assertEqual(domstr, '<?xml version="1.0" ?>'
|
||||
'<elem>&<>"'
|
||||
'<cr>\r</cr>'
|
||||
'<crlf>\r\n</crlf>'
|
||||
'<lflf>\n\n</lflf>'
|
||||
'<ws>\t\n\r </ws></elem>')
|
||||
|
||||
def test_toxml_quote_attrib(self):
|
||||
dom = Document()
|
||||
elem = dom.appendChild(dom.createElement('elem'))
|
||||
elem.setAttribute("a", '&<>"')
|
||||
elem.setAttribute("cr", "\r")
|
||||
elem.setAttribute("lf", "\n")
|
||||
elem.setAttribute("crlf", "\r\n")
|
||||
elem.setAttribute("lflf", "\n\n")
|
||||
elem.setAttribute("ws", "\t\n\r ")
|
||||
domstr = dom.toxml()
|
||||
dom.unlink()
|
||||
self.assertEqual(domstr, '<?xml version="1.0" ?>'
|
||||
'<elem a="&<>"" '
|
||||
'cr=" " '
|
||||
'lf=" " '
|
||||
'crlf=" " '
|
||||
'lflf=" " '
|
||||
'ws="	 "/>')
|
||||
|
||||
def testAltNewline(self):
|
||||
str = '<?xml version="1.0" ?>\n<a b="c"/>\n'
|
||||
dom = parseString(str)
|
||||
|
|
|
@ -300,12 +300,28 @@ def _in_document(node):
|
|||
node = node.parentNode
|
||||
return False
|
||||
|
||||
def _write_data(writer, data):
|
||||
def _write_data(writer, text, attr):
|
||||
"Writes datachars to writer."
|
||||
if data:
|
||||
data = data.replace("&", "&").replace("<", "<"). \
|
||||
replace("\"", """).replace(">", ">")
|
||||
writer.write(data)
|
||||
if not text:
|
||||
return
|
||||
# See the comments in ElementTree.py for behavior and
|
||||
# implementation details.
|
||||
if "&" in text:
|
||||
text = text.replace("&", "&")
|
||||
if "<" in text:
|
||||
text = text.replace("<", "<")
|
||||
if ">" in text:
|
||||
text = text.replace(">", ">")
|
||||
if attr:
|
||||
if '"' in text:
|
||||
text = text.replace('"', """)
|
||||
if "\r" in text:
|
||||
text = text.replace("\r", " ")
|
||||
if "\n" in text:
|
||||
text = text.replace("\n", " ")
|
||||
if "\t" in text:
|
||||
text = text.replace("\t", "	")
|
||||
writer.write(text)
|
||||
|
||||
def _get_elements_by_tagName_helper(parent, name, rc):
|
||||
for node in parent.childNodes:
|
||||
|
@ -883,7 +899,7 @@ class Element(Node):
|
|||
|
||||
for a_name in attrs.keys():
|
||||
writer.write(" %s=\"" % a_name)
|
||||
_write_data(writer, attrs[a_name].value)
|
||||
_write_data(writer, attrs[a_name].value, True)
|
||||
writer.write("\"")
|
||||
if self.childNodes:
|
||||
writer.write(">")
|
||||
|
@ -1112,7 +1128,7 @@ class Text(CharacterData):
|
|||
return newText
|
||||
|
||||
def writexml(self, writer, indent="", addindent="", newl=""):
|
||||
_write_data(writer, "%s%s%s" % (indent, self.data, newl))
|
||||
_write_data(writer, "%s%s%s" % (indent, self.data, newl), False)
|
||||
|
||||
# DOM Level 3 (WD 9 April 2002)
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
:mod:`xml.dom.minidom` now preserves whitespaces in attributes.
|
|
@ -0,0 +1 @@
|
|||
:mod:`xml.dom.minidom` now only quotes ``"`` in attributes.
|
Loading…
Reference in New Issue