Was ist der beste Weg (oder sind die verschiedenen Möglichkeiten) zu schön drucken XML in Python?
Antworten
Zu viele Anzeigen?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')
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
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.
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í .
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 .