527 Stimmen

Hübsches Drucken von XML in Python

Was ist der beste Weg (oder sind die verschiedenen Möglichkeiten) zu schön drucken XML in Python?

8voto

giltay Punkte 1925

Ich hatte einige Probleme mit dem hübschen Druck von minidom. Ich bekam einen UnicodeError, wenn ich versuchte, ein Dokument mit Zeichen außerhalb der angegebenen Kodierung zu drucken, z.B. wenn ich ein in einem Dokument hatte und ich versuchte doc.toprettyxml(encoding='latin-1') . Hier ist mein Workaround dafür:

def toprettyxml(doc, encoding):
    """Return a pretty-printed XML document in a given encoding."""
    unistr = doc.toprettyxml().replace(u'<?xml version="1.0" ?>',
                          u'<?xml version="1.0" encoding="%s"?>' % encoding)
    return unistr.encode(encoding, 'xmlcharrefreplace')

6voto

nacitar sevaht Punkte 496

Ich habe eine Lösung geschrieben, um durch einen bestehenden ElementTree zu gehen und text/tail zu verwenden, um ihn so einzurücken, wie man es normalerweise erwartet.

def prettify(element, indent='  '):
    queue = [(0, element)]  # (level, element)
    while queue:
        level, element = queue.pop(0)
        children = [(level + 1, child) for child in list(element)]
        if children:
            element.text = '\n' + indent * (level+1)  # for child open
        if queue:
            element.tail = '\n' + indent * queue[0][0]  # for sibling open
        else:
            element.tail = '\n' + indent * (level-1)  # for parent close
        queue[0:0] = children  # prepend so children come before siblings

6voto

John Smith Optional Punkte 18395
from yattag import indent

pretty_string = indent(ugly_string)

Es werden keine Leerzeichen oder Zeilenumbrüche innerhalb von Textknoten eingefügt, es sei denn, Sie bitten darum mit:

indent(mystring, indent_text = True)

Sie können angeben, wie die Einrückungseinheit sein soll und wie der Zeilenumbruch aussehen soll.

pretty_xml_string = indent(
    ugly_xml_string,
    indentation = '    ',
    newline = '\r\n'
)

Das Dokument ist auf http://www.yattag.org Homepage.

5voto

Josh Correia Punkte 2680

Hier ist eine Python3-Lösung, die das hässliche Newline-Problem (Tonnen von Leerzeichen) loswird, und es verwendet nur Standardbibliotheken im Gegensatz zu den meisten anderen Implementierungen.

import xml.etree.ElementTree as ET
import xml.dom.minidom
import os

def pretty_print_xml_given_root(root, output_xml):
    """
    Useful for when you are editing xml data on the fly
    """
    xml_string = xml.dom.minidom.parseString(ET.tostring(root)).toprettyxml()
    xml_string = os.linesep.join([s for s in xml_string.splitlines() if s.strip()]) # remove the weird newline issue
    with open(output_xml, "w") as file_out:
        file_out.write(xml_string)

def pretty_print_xml_given_file(input_xml, output_xml):
    """
    Useful for when you want to reformat an already existing xml file
    """
    tree = ET.parse(input_xml)
    root = tree.getroot()
    pretty_print_xml_given_root(root, output_xml)

Ich habe herausgefunden, wie man das Problem mit dem Zeilenumbruch beheben kann aquí .

3voto

Dan Lew Punkte 83507

XML pretty print für Python sieht für diese Aufgabe ziemlich gut aus. (Auch der Name ist passend.)

Eine Alternative ist die Verwendung von pyXML die einen PrettyPrint-Funktion .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X