2013-01-23 15 views
13

Ich habe eine minidom.toprettyxml verwendet, um meine XML-Datei zu verschönern. Wenn ich eine XML-Datei erstelle und diese Methode benutze, werden alle Probleme gemeistert, aber wenn ich sie benutze, nachdem ich die XML-Datei geändert habe (zum Beispiel habe ich einen zusätzlichen Knoten hinzugefügt), schreibe ich sie zurück XML, ich bin immer leere Zeilen, jedes Mal, wenn ich es bin zu aktualisieren, ich bin immer mehr leere Zeilen bekommen ...Leere Zeilen bei der Verwendung von minidom.toprettyxml

mein 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=" ") 

und das Ergebnis:

<?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> 

irgendwelche Vorschläge?

danke.

Antwort

15

fand ich hier eine Lösung: http://code.activestate.com/recipes/576750-pretty-print-xml/

Dann modifiziert ich es eine Zeichenfolge anstelle einer Datei zu übernehmen.

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()]) 

Ausgang:

<?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> 

Dies kann Ihnen helfen, es in Ihrer Funktion ein wenig Arbeit leichter:

def new_prettify(): 
    reparsed = parseString(CONTENT) 
    print '\n'.join([line for line in reparsed.toprettyxml(indent=' '*2).split('\n') if line.strip()]) 
+0

Joe - leider bekomme ich eine Ausnahme vom Parser "muss String oder nur-Lese-Puffer sein, nicht Element" – Igal

+0

Joe - nur um es klar zu machen? Muss ich diesen Code verwenden, während ich den XML-Code erstelle oder nachdem er erstellt wurde und nur die leeren Zeilen entfernt werden? Vielen Dank. – Igal

+0

Gelöst, Großartig !! Danke ! – Igal

0

Verwendung dieses zu lösen Problem mit den Linien

toprettyxml(indent=' ', newl='\r', encoding="utf-8")

+1

Obwohl dies dem Problem helfen könnte, würde ich Ihnen empfehlen, genauer zu beschreiben, wie Ihre Antwort hilft. – Wtower

3

Ich fand eine einfache Lösung für dieses Problem, nur mit der letzten Zeile zu ändern von Ihnen prettify(), so wird es sein:

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='') 
0

ich mit Python 2.7 (32b) in einem Windows das gleiche Problem habe 10 Maschine. Das Problem scheint zu sein, dass wenn Python einen XML-Text zu einem ElementTree-Objekt analysiert, fügt es einige nervende Zeilenvorschübe zu den "Text" - oder "Schwanz" -Attributen jedes Elements hinzu.

Dieses Skript entfernt solchen Zeilenumbruch Zeichen:

def removeAnnoyingLines(elem): 
    hasWords = re.compile("\\w") 
    for element in elem.iter(): 
     if not re.search(hasWords,str(element.tail)): 
      element.tail="" 
     if not re.search(hasWords,str(element.text)): 
      element.text = "" 

Mit dieser Funktion vor "pretty-printing" Ihr Baum:

removeAnnoyingLines(element) 
myXml = xml.dom.minidom.parseString(xml.etree.ElementTree.tostring(element)) 
print myXml.toprettyxml() 

Es ist für mich gearbeitet. Ich hoffe es funktioniert für dich!