2012-10-13 7 views
8

Angenommen, ich XML wie diese:Wie können Attribute in Python in Prettyprinting von XML eingerückt werden?

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

Der erste Element Name mit all seinen Attributen in einer Zeile angezeigt.

Ich habe gesehen, wie schön das Element Baum zu drucken, mit lxml, mit Code wie folgt:

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

... aber mit, dass jedes Element in einer Zeile erscheint.

Gibt es eine magische Beschwörung, um dem hübschen Drucker zu sagen, dass er zwischen den Elementattributen Zeilenumbrüche einfügen soll, so dass die Zeilenlänge beispielsweise 80 Zeichen nicht überschreitet?

ich das Ergebnis möchte etwas wie folgt aussehen:

<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: Ich will nicht zu subprocess greifen und xmllint

Antwort

2

lxml hat eine ziemlich Druckfunktion eingebaut: here's a tutorial die beschreibt mehrere Möglichkeiten zum Drucken von XML. Es hat einige limitations (Einschränkungen in den Xml-Spezifikationen, nach lxml), obwohl.

This stackoverflow question hat mehrere Antworten mit mehr oder weniger hacky Lösungen für pretty print xml, und ich denke, dass Sie zumindest die regexp-basierte Antwort nach Ihren Bedürfnissen modellieren könnten.

Fredrik Lundh (von ElementTree Ruhm) hat eine sehr niedriges Niveau Beschreibung für printing xml, die Sie auch auf Newline und indent Attribute anpassen können.