2013-07-01 12 views
35

Próbuję użyć xml.etree.elementtree, aby wypisać pliki XML z Python. Problem polega na tym, że generują generowane w jednym wierszu. Chcę być w stanie łatwo je odnieść, więc jeśli to możliwe, naprawdę chciałbym móc je wypisać w sposób czysty.Użyj xml.etree.elementtree do drukowania ładnie sformatowanych plików xml

To co ja dostaję

<Language><En><Port>Port</Port><UserName>UserName</UserName></En><Ch><Port>IP地址</Port><UserName>用户名称</UserName></Ch></Language> 

To, co chciałbym zobaczyć.

<Language> 
    <En> 
     <Port>Port</Port> 
     <UserName>UserName</UserName> 
    </En> 
    <Ch> 
     <Port>IP地址</Port> 
     <UserName>用户名称</UserName> 
    </Ch> 
</Language> 
+30

To nie jest prawda, duplikat: Inne pytanie pozostawia możliwość korzystania sprzedawane a jakimkolwiek biblioteki XML. To pytanie wymaga konkretnie rozwiązania, gdy już pracujesz z biblioteką elementu_wbudowanego elementu tree_. Imho ma sens, aby zadać to pytanie specjalnie dla tej biblioteki, ponieważ jest to najwyraźniej brakująca funkcja !? – bluenote10

+1

możesz użyć funkcji podobnej do tej, którą znalazłem tutaj: http://effbot.org/zone/element-lib.htm#prettyprint –

+0

@ bluenote10 Kiedy ktoś zgłosi, inni ludzie powtórzą raport, tylko po to, by podążyć za tobą. Jestem z Kolumbii, bardzo przepraszam za mój zły angielski. –

Odpowiedz

51

Można użyć funkcji toprettyxml z xml.dom.minidom, aby to zrobić:

def prettify(elem): 
    """Return a pretty-printed XML string for the Element. 
    """ 
    rough_string = ElementTree.tostring(elem, 'utf-8') 
    reparsed = minidom.parseString(rough_string) 
    return reparsed.toprettyxml(indent="\t") 

Chodzi o to, aby wydrukować Element w ciąg, przetworzyć go za pomocą minidom i przekształcić go ponownie w XML przy użyciu funkcja toprettyxml.

Źródło: http://pymotw.com/2/xml/etree/ElementTree/create.html

+9

To dodaje dodatkowe linie. Nie jestem pewien, czy nazwałbym to tak ładnie. –

+4

Dla dużego pliku wymaga to jednak reparacji całego kodu XML. hmm ... –

15

Można użyć biblioteki lxml, która jest rozszerzeniem ElementTree. Jego metoda toString() zawiera parametr pretty_print - na przykład:

>>> print(etree.tostring(root, pretty_print=True)) 
<root> 
    <child1/> 
    <child2/> 
    <child3/> 
</root> 
Powiązane problemy