2011-02-23 18 views
10

Po przeczytaniu istniejącego pliku z "brzydkim" XML i wprowadzeniem pewnych modyfikacji, ładowanie drukowania nie działa. Próbowałem już etree.write(FILE_NAME, pretty_print=True).Python ładna drukarka XML z lxml

Mam następujące XML:

<testsuites tests="14" failures="0" disabled="0" errors="0" time="0.306" name="AllTests"> 
    <testsuite name="AIR" tests="14" failures="0" disabled="0" errors="0" time="0.306"> 
.... 

i używam go tak:

tree = etree.parse('original.xml') 
root = tree.getroot() 

...  
# modifications 
... 

with open(FILE_NAME, "w") as f: 
    tree.write(f, pretty_print=True) 

Odpowiedz

33

Dla mnie ten problem nie został rozwiązany, dopóki nie zauważyłem, że ten mały smakołyk tutaj:

http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output

wersja skrócona:

Czytaj w pliku z tym poleceniem:

>>> parser = etree.XMLParser(remove_blank_text=True) 
>>> tree = etree.parse(filename, parser) 

To będzie „reset” już istniejącego wcięcia, umożliwiając wyjście wygenerować swój własny wcięcia poprawnie. Następnie pretty_print jak zwykle:

>>> tree.write(<output_file_name>, pretty_print=True) 
6
fp = file('out.txt', 'w') 
print(e.tree.tostring(...), file=fp) 
fp.close() 
+0

Co to jest e.tree? –

7

Cóż, według API docs, nie istnieje metoda "zapisu" w moduł lxml etree. Masz kilka opcji dotyczących otrzymania ładnie wydrukowanego ciągu xml do pliku. Można użyć metody toString tak:

f = open('doc.xml', 'w') 
f.write(etree.tostring(root, pretty_print=True)) 
f.close() 

Lub, jeśli źródłem sygnału jest mniejsza niż idealne i/lub chcesz więcej pokręteł i przycisków, aby skonfigurować obecnie wprowadzone można użyć jednego z owijarki Pythona dla uporządkowana lib.

http://utidylib.berlios.de/

import tidy 
f.write(tidy.parseString(your_xml_str, **{'output_xml':1, 'indent':1, 'input_xml':1})) 

http://countergram.com/open-source/pytidylib

from tidylib import tidy_document 
document, errors = tidy_document(your_xml_str, options={'output_xml':1, 'indent':1, 'input_xml':1}) 
f.write(document) 
2

Nie jestem pewien, dlaczego inne odpowiedzi nie wspomniały o tym. Jeśli chcesz uzyskać katalog główny xml, istnieje metoda o nazwie getroot(). Mam nadzieję, że odpowiedziałem na twoje pytanie (choć trochę późno).

tree = et.parse(xmlFile) 
root = tree.getroot()