summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_minidom.py37
-rw-r--r--Lib/xml/dom/minidom.py14
-rw-r--r--Misc/NEWS4
3 files changed, 45 insertions, 10 deletions
diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py
index 2621f72..392e40e 100644
--- a/Lib/test/test_minidom.py
+++ b/Lib/test/test_minidom.py
@@ -467,12 +467,39 @@ class MinidomTest(unittest.TestCase):
dom.unlink()
self.confirm(domstr == str.replace("\n", "\r\n"))
+ def test_toprettyxml_with_text_nodes(self):
+ # see issue #4147, text nodes are not indented
+ decl = '<?xml version="1.0" ?>\n'
+ self.assertEqual(parseString('<B>A</B>').toprettyxml(),
+ decl + '<B>A</B>\n')
+ self.assertEqual(parseString('<C>A<B>A</B></C>').toprettyxml(),
+ decl + '<C>\n\tA\n\t<B>A</B>\n</C>\n')
+ self.assertEqual(parseString('<C><B>A</B>A</C>').toprettyxml(),
+ decl + '<C>\n\t<B>A</B>\n\tA\n</C>\n')
+ self.assertEqual(parseString('<C><B>A</B><B>A</B></C>').toprettyxml(),
+ decl + '<C>\n\t<B>A</B>\n\t<B>A</B>\n</C>\n')
+ self.assertEqual(parseString('<C><B>A</B>A<B>A</B></C>').toprettyxml(),
+ decl + '<C>\n\t<B>A</B>\n\tA\n\t<B>A</B>\n</C>\n')
+
+ def test_toprettyxml_with_adjacent_text_nodes(self):
+ # see issue #4147, adjacent text nodes are indented normally
+ dom = Document()
+ elem = dom.createElement('elem')
+ elem.appendChild(dom.createTextNode('TEXT'))
+ elem.appendChild(dom.createTextNode('TEXT'))
+ dom.appendChild(elem)
+ decl = '<?xml version="1.0" ?>\n'
+ self.assertEqual(dom.toprettyxml(),
+ decl + '<elem>\n\tTEXT\n\tTEXT\n</elem>\n')
+
def test_toprettyxml_preserves_content_of_text_node(self):
- str = '<A>B</A>'
- dom = parseString(str)
- dom2 = parseString(dom.toprettyxml())
- self.assertEqual(dom.childNodes[0].childNodes[0].toxml(),
- dom2.childNodes[0].childNodes[0].toxml())
+ # see issue #4147
+ for str in ('<B>A</B>', '<A><B>C</B></A>'):
+ dom = parseString(str)
+ dom2 = parseString(dom.toprettyxml())
+ self.assertEqual(
+ dom.getElementsByTagName('B')[0].childNodes[0].toxml(),
+ dom2.getElementsByTagName('B')[0].childNodes[0].toxml())
def testProcessingInstruction(self):
dom = parseString('<e><?mypi \t\n data \t\n ?></e>')
diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py
index 386494d..f23ad05 100644
--- a/Lib/xml/dom/minidom.py
+++ b/Lib/xml/dom/minidom.py
@@ -837,11 +837,15 @@ class Element(Node):
writer.write("\"")
if self.childNodes:
writer.write(">")
- if self.childNodes[0].nodeType != Node.TEXT_NODE:
+ if (len(self.childNodes) == 1 and
+ self.childNodes[0].nodeType == Node.TEXT_NODE):
+ self.childNodes[0].writexml(writer, '', '', '')
+ else:
writer.write(newl)
- for node in self.childNodes:
- node.writexml(writer,indent+addindent,addindent,newl)
- writer.write("%s</%s>%s" % (indent,self.tagName,newl))
+ for node in self.childNodes:
+ node.writexml(writer, indent+addindent, addindent, newl)
+ writer.write(indent)
+ writer.write("</%s>%s" % (self.tagName, newl))
else:
writer.write("/>%s"%(newl))
@@ -1063,7 +1067,7 @@ class Text(CharacterData):
return newText
def writexml(self, writer, indent="", addindent="", newl=""):
- _write_data(writer, self.data)
+ _write_data(writer, "%s%s%s" % (indent, self.data, newl))
# DOM Level 3 (WD 9 April 2002)
diff --git a/Misc/NEWS b/Misc/NEWS
index af8eaf4..4bf4666 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -377,6 +377,10 @@ Core and Builtins
Library
-------
+- Issue #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.
+
- Issue #13374: The Windows bytes API has been deprecated in the os module. Use
Unicode filenames instead of bytes filenames to not depend on the ANSI code
page anymore and to support any filename.