Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Empty lines while using minidom.toprettyxml

Tags:

I've been using a minidom.toprettyxml for prettify my xml file. When I'm creating XML file and using this method, all works grate, but if I use it after I've modified the xml file (for examp I've added an additional nodes) and then I'm writing it back to XML, I'm getting empty lines, each time I'm updating it, I'm getting more and more empty lines...

my code :

file.write(prettify(xmlRoot))   def prettify(elem):     rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree     reparsed = mini.parseString(rough_string) //mini as minidom     return reparsed.toprettyxml(indent=" ") 

and the result :

<?xml version="1.0" ?> <testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0"     tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460">         <testcase classname="TC test" name="t1" status="Failed" time="27.013"/>         <testcase classname="TC test" name="t2" status="Failed" time="78.325"/>       <testcase classname="TC test" name="t3" status="Failed" time="37.357"/> </testsuite> 

any suggestions ?

thanks.

like image 823
Igal Avatar asked Jan 23 '13 12:01

Igal


People also ask

What is XML DOM. minidom?

xml. dom. minidom is a minimal implementation of the Document Object Model interface, with an API similar to that in other languages.

What is Toprettyxml?

toprettyxml. n.toprettyxml(indent='\t',newl='\n') Returns a string, plain or Unicode, with the XML source for the subtree rooted at n, using indent to indent nested tags and newl to end lines. toxml. n.toxml( )

Is there a DOM in Python?

The DOM is a standard tree representation for XML data. The Document Object Model is being defined by the W3C in stages, or “levels” in their terminology. The Python mapping of the API is substantially based on the DOM Level 2 recommendation. DOM applications typically start by parsing some XML into a DOM.


2 Answers

I found a solution here: http://code.activestate.com/recipes/576750-pretty-print-xml/

Then I modified it to take a string instead of a file.

from xml.dom.minidom import parseString  pretty_print = lambda data: '\n'.join([line for line in parseString(data).toprettyxml(indent=' '*2).split('\n') if line.strip()]) 

Output:

<?xml version="1.0" ?> <testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0" tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460">   <testcase classname="TC test" name="t1" status="Failed" time="27.013"/>   <testcase classname="TC test" name="t2" status="Failed" time="78.325"/>   <testcase classname="TC test" name="t3" status="Failed" time="37.357"/> </testsuite> 

This may help you work it into your function a little be easier:

def new_prettify():     reparsed = parseString(CONTENT)     print '\n'.join([line for line in reparsed.toprettyxml(indent=' '*2).split('\n') if line.strip()]) 
like image 109
Joe Avatar answered Oct 02 '22 02:10

Joe


I found an easy solution for this problem, just with changing the last line of your prettify() so it will be:

def prettify(elem): rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree reparsed = mini.parseString(rough_string) //mini as minidom return reparsed.toprettyxml(indent=" ", newl='') 
like image 23
Sidali Smaili Avatar answered Oct 02 '22 02:10

Sidali Smaili