2012-10-13 14 views
8

Supponiamo che io sono XML come questo:Come indentare gli attributi in quando prettyprinting xml in 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> 

Il primo nome elemento con tutti i suoi attributi appaiono tutti su una sola riga.

ho visto come stampare abbastanza l'albero elemento, utilizzando lxml, con codice come questo:

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

... ma usando che, ogni elemento appare su una riga.

Esiste un magico incantesimo per dire alla graziosa stampante di inserire nuove linee tra gli attributi dell'elemento in modo che, ad esempio, la lunghezza della linea non superi 80 caratteri?

vorrei il risultato simile a questo:

<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: io non voglio ricorrere a subprocess e xmllint

risposta

2

lxml ha una funzione di stampa piuttosto costruito in: here's a tutorial che descrive diversi modi per stampare xml. Tuttavia, ha alcune limitations (limitazioni nelle specifiche xml, secondo lxml).

This stackoverflow question ha diverse risposte con più o meno soluzioni per hacky alla bella xml di stampa, e penso che potresti modellare almeno la risposta basata su espressioni regolari in base alle tue esigenze.

Fredrik Lundh (di ElementTree fama) ha una descrizione di livello molto basso per printing xml, che è possibile personalizzare anche per gli attributi di nuova riga e di rientro.

Problemi correlati