Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8008f2a

Browse files
committed
#4147: minidom's toprettyxml no longer adds whitespace around a text node when it is the only child of an element. Initial patch by Dan Kenigsberg.
1 parent e62aad3 commit 8008f2a

3 files changed

Lines changed: 45 additions & 10 deletions

File tree

Lib/test/test_minidom.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -446,12 +446,39 @@ def testAltNewline(self):
446446
dom.unlink()
447447
self.confirm(domstr == str.replace("\n", "\r\n"))
448448

449+
def test_toprettyxml_with_text_nodes(self):
450+
# see issue #4147, text nodes are not indented
451+
decl = '<?xml version="1.0" ?>\n'
452+
self.assertEqual(parseString('<B>A</B>').toprettyxml(),
453+
decl + '<B>A</B>\n')
454+
self.assertEqual(parseString('<C>A<B>A</B></C>').toprettyxml(),
455+
decl + '<C>\n\tA\n\t<B>A</B>\n</C>\n')
456+
self.assertEqual(parseString('<C><B>A</B>A</C>').toprettyxml(),
457+
decl + '<C>\n\t<B>A</B>\n\tA\n</C>\n')
458+
self.assertEqual(parseString('<C><B>A</B><B>A</B></C>').toprettyxml(),
459+
decl + '<C>\n\t<B>A</B>\n\t<B>A</B>\n</C>\n')
460+
self.assertEqual(parseString('<C><B>A</B>A<B>A</B></C>').toprettyxml(),
461+
decl + '<C>\n\t<B>A</B>\n\tA\n\t<B>A</B>\n</C>\n')
462+
463+
def test_toprettyxml_with_adjacent_text_nodes(self):
464+
# see issue #4147, adjacent text nodes are indented normally
465+
dom = Document()
466+
elem = dom.createElement('elem')
467+
elem.appendChild(dom.createTextNode('TEXT'))
468+
elem.appendChild(dom.createTextNode('TEXT'))
469+
dom.appendChild(elem)
470+
decl = '<?xml version="1.0" ?>\n'
471+
self.assertEqual(dom.toprettyxml(),
472+
decl + '<elem>\n\tTEXT\n\tTEXT\n</elem>\n')
473+
449474
def test_toprettyxml_preserves_content_of_text_node(self):
450-
str = '<A>B</A>'
451-
dom = parseString(str)
452-
dom2 = parseString(dom.toprettyxml())
453-
self.assertEqual(dom.childNodes[0].childNodes[0].toxml(),
454-
dom2.childNodes[0].childNodes[0].toxml())
475+
# see issue #4147
476+
for str in ('<B>A</B>', '<A><B>C</B></A>'):
477+
dom = parseString(str)
478+
dom2 = parseString(dom.toprettyxml())
479+
self.assertEqual(
480+
dom.getElementsByTagName('B')[0].childNodes[0].toxml(),
481+
dom2.getElementsByTagName('B')[0].childNodes[0].toxml())
455482

456483
def testProcessingInstruction(self):
457484
dom = parseString('<e><?mypi \t\n data \t\n ?></e>')

Lib/xml/dom/minidom.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -837,11 +837,15 @@ def writexml(self, writer, indent="", addindent="", newl=""):
837837
writer.write("\"")
838838
if self.childNodes:
839839
writer.write(">")
840-
if self.childNodes[0].nodeType != Node.TEXT_NODE:
840+
if (len(self.childNodes) == 1 and
841+
self.childNodes[0].nodeType == Node.TEXT_NODE):
842+
self.childNodes[0].writexml(writer, '', '', '')
843+
else:
841844
writer.write(newl)
842-
for node in self.childNodes:
843-
node.writexml(writer,indent+addindent,addindent,newl)
844-
writer.write("%s</%s>%s" % (indent,self.tagName,newl))
845+
for node in self.childNodes:
846+
node.writexml(writer, indent+addindent, addindent, newl)
847+
writer.write(indent)
848+
writer.write("</%s>%s" % (self.tagName, newl))
845849
else:
846850
writer.write("/>%s"%(newl))
847851

@@ -1063,7 +1067,7 @@ def splitText(self, offset):
10631067
return newText
10641068

10651069
def writexml(self, writer, indent="", addindent="", newl=""):
1066-
_write_data(writer, self.data)
1070+
_write_data(writer, "%s%s%s" % (indent, self.data, newl))
10671071

10681072
# DOM Level 3 (WD 9 April 2002)
10691073

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ Core and Builtins
7676
Library
7777
-------
7878

79+
- Issue #4147: minidom's toprettyxml no longer adds whitespace around a text
80+
node when it is the only child of an element. Initial patch by Dan
81+
Kenigsberg.
82+
7983
- Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly
8084
handles non-valid attributes, including adjacent and unquoted attributes.
8185

0 commit comments

Comments
 (0)