2013-01-23 12 views
13

Ho usato un minidom.toprettyxml per pretrattare il mio file xml. Quando creo file XML e utilizzo questo metodo, tutto funziona alla griglia, ma se lo uso dopo aver modificato il file xml (per esempio ho aggiunto un nodo aggiuntivo) e poi lo sto scrivendo di nuovo XML, mi sto linee vuote, ogni volta che sto aggiornando, sto diventando sempre più linee vuote ...Linee vuote durante l'utilizzo di minidom.toprettyxml

il mio codice:

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

e il risultato:

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

qualche suggerimento?

grazie.

risposta

15

ho trovato una soluzione qui: http://code.activestate.com/recipes/576750-pretty-print-xml/

Poi ho modificato di prendere una stringa invece di un 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()]) 

uscita:

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

Questo può aiutare a lavorare nella tua funzione di un po 'più facile:

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

Joe - sfortunatamente sto ricevendo un'eccezione dal parser "deve essere una stringa o un buffer di sola lettura, non un elemento" – Igal

+0

Joe - solo per mettere in chiaro? devo usare questo codice mentre sto creando l'xml o dopo che è stato creato e rimuove solo le linee vuote? Grazie. – Igal

+0

Risolto, Ottimo !! grazie ! – Igal

0

uso questo per risolvere il problema con le linee

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

+1

Sebbene ciò possa aiutare il problema, ti consiglierei di descrivere più dettagliatamente in che modo la tua risposta è di aiuto. – Wtower

3

Ho trovato una semplice soluzione per questo problema, solo con il cambiamento l'ultima riga di voi abbellite() in modo che sarà:

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

Sto avendo lo stesso problema con Python 2.7 (32b) in un Windows 10 macchina. Il problema sembra essere che quando python analizza un testo XML su un oggetto ElementTree, aggiunge alcuni fastidiosi feed di riga agli attributi "text" o "tail" di ogni elemento.

Questo script rimuove tali caratteri di interruzione di riga:

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

Usare questa funzione prima di "pretty-printing" il vostro albero:

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

ha funzionato per me. Spero che funzioni per te!

Problemi correlati