2012-10-13 9 views
8

Załóżmy, że mam XML tak:Jak wcięcia atrybutów, gdy prettyprinting xml w python?

<graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML" directed="1"> 
    <foo>...</foo> 
</graph> 

Pierwsza nazwa elementu ze wszystkimi jego atrybutami wszystkich pojawiających się na jednej linii.

Widziałem jak całkiem wydrukować drzewa elementów, używając lxml, z kodem tak:

from lxml import etree 
... 
def prettyPrintXml(filePath): 
    assert filePath is not None 
    parser = etree.XMLParser(resolve_entities=False, remove_blank_text=True, 
          strip_cdata=False) 
    document = etree.parse(filePath, parser) 
    print(etree.tostring(document, pretty_print=True, encoding='utf-8')) 

... ale używając, że w jednym wierszu pojawia każdy element.

Czy istnieje magiczne zaklęcie informujące ładną drukarkę o wstawieniu nowych linii między atrybutami elementu, aby np. Długość linii nie przekraczała 80 znaków?

Chciałbym wynik wyglądać mniej więcej tak:

<graph label="Test" 
     xmlns:dc="http://purl.org/dc/elements/1.1/" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:cy="http://www.cytoscape.org" 
     xmlns="http://www.cs.rpi.edu/XGMML" directed="1"> 
    <foo>...</foo> 
</graph> 

PS: nie chcę uciekać się do subprocess i xmllint

Odpowiedz

2

lxml ma dość Funkcja drukowania wbudowany: here's a tutorial który opisuje kilka sposobów drukowania xml. Ma jednak pewną liczbę limitations (ograniczenia w specyfikacji xml, zgodnie z lxml).

This stackoverflow question ma kilka odpowiedzi z mniej lub bardziej hackowskimi rozwiązaniami do ładnego drukowania xml i myślę, że można modelować przynajmniej odpowiedź opartą na regexp w zależności od potrzeb.

Fredrik Lundh (od ElementTree FAME) posiada opis bardzo niskiego poziomu dla printing xml, które można również dostosować do nowej linii i tiret atrybutów.

Powiązane problemy