Was ist der beste Weg (oder die verschiedenen Wege), um XML in Python hübsch zu drucken?
python
xml
pretty-print
Hortitude
quelle
quelle
lxml ist neu, aktualisiert und enthält eine hübsche Druckfunktion
Schauen Sie sich das lxml-Tutorial an: http://lxml.de/tutorial.html
quelle
aptitude install
weg. Unter OS / X bin ich mir nicht sicher.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. Das Schreiben in eine Ausgabedatei ist in nur einer Zeile möglich, es wird keine Zwischenvariable benötigt:etree.parse("filename").write("outputfile", encoding="utf-8")
Eine andere Lösung besteht darin, diese
indent
Funktion zur Verwendung mit der ElementTree-Bibliothek auszuleihen, die seit 2.5 in Python integriert ist. So würde das aussehen:quelle
tree.write([filename])
in eine Datei schreiben können (diestree
ist die ElementTree-Instanz).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Hier ist meine (hackige?) Lösung, um das hässliche Textknotenproblem zu umgehen.
Der obige Code erzeugt:
An Stelle von:
Haftungsausschluss: Es gibt wahrscheinlich einige Einschränkungen.
quelle
re.compile
vor dersub
Operation verwendet (ich habe siere.findall()
zweimal verwendetzip
und einefor
Schleife mitstr.replace()
...)Wie andere betonten, ist in lxml ein hübscher Drucker eingebaut.
Beachten Sie jedoch, dass CDATA-Abschnitte standardmäßig in normalen Text geändert werden, was zu unangenehmen Ergebnissen führen kann.
Hier ist eine Python-Funktion, die die Eingabedatei beibehält und nur den Einzug ändert (beachten Sie das
strip_cdata=False
). Außerdem wird sichergestellt, dass die Ausgabe UTF-8 als Codierung anstelle des Standard-ASCII verwendet (beachten Sie Folgendesencoding='utf-8'
):Anwendungsbeispiel:
quelle
BeautifulSoup hat eine einfach zu verwendende
prettify()
Methode.Es wird ein Leerzeichen pro Einrückungsstufe eingerückt. Es funktioniert viel besser als der hübsche Druck von lxml und ist kurz und bündig.
quelle
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Wenn Sie haben
xmllint
, können Sie einen Unterprozess erzeugen und verwenden.xmllint --format <file>
druckt seine Eingabe-XML hübsch in die Standardausgabe.Beachten Sie, dass diese Methode ein Programm außerhalb von Python verwendet, was es zu einer Art Hack macht.
quelle
Ich habe versucht, die Antwort von "ade" oben zu bearbeiten, aber Stack Overflow ließ mich nicht bearbeiten, nachdem ich ursprünglich anonym Feedback gegeben hatte. Dies ist eine weniger fehlerhafte Version der Funktion zum hübschen Drucken eines ElementTree.
quelle
Wenn Sie eine DOM-Implementierung verwenden, verfügt jede über eine eigene integrierte Form des hübschen Druckens:
Wenn Sie etwas anderes ohne eigenen hübschen Drucker verwenden - oder diese hübschen Drucker tun es nicht ganz so, wie Sie es möchten -, müssen Sie wahrscheinlich Ihren eigenen Serialisierer schreiben oder unterordnen.
quelle
Ich hatte einige Probleme mit dem hübschen Druck von Minidom. Ich würde einen UnicodeError erhalten, wenn ich versuchte, ein Dokument mit Zeichen außerhalb der angegebenen Codierung hübsch zu drucken, z. B. wenn ich ein β in einem Dokument hatte und es versuchte
doc.toprettyxml(encoding='latin-1')
. Hier ist meine Problemumgehung dafür:quelle
Es werden keine Leerzeichen oder Zeilenumbrüche in Textknoten hinzugefügt, es sei denn, Sie fragen danach mit:
Sie können festlegen, wie die Einrückungseinheit sein soll und wie die neue Zeile aussehen soll.
Das Dokument befindet sich auf der Homepage von http://www.yattag.org .
quelle
Ich habe eine Lösung geschrieben, um durch einen vorhandenen ElementTree zu gehen und ihn mit Text / Schwanz einzurücken, wie man es normalerweise erwartet.
quelle
XML Pretty Print für Python sieht für diese Aufgabe ziemlich gut aus. (Passend auch benannt.)
Eine Alternative ist die Verwendung von pyXML mit einer PrettyPrint-Funktion .
quelle
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Denken Sie, dass das Projekt heutzutage auf dem Dachboden ist, schade.Hier ist eine Python3-Lösung, die das hässliche Newline-Problem (Tonnen von Leerzeichen) beseitigt und im Gegensatz zu den meisten anderen Implementierungen nur Standardbibliotheken verwendet.
Ich habe hier herausgefunden, wie das häufig auftretende Newline-Problem behoben werden kann .
quelle
Sie können die beliebte externe Bibliothek xmltodict verwenden , mit
unparse
undpretty=True
Sie erhalten das beste Ergebnis:full_document=False
gegen<?xml version="1.0" encoding="UTF-8"?>
an der Spitze.quelle
Schauen Sie sich das vkbeautify- Modul an.
Es ist eine Python-Version meines sehr beliebten Javascript / NodeJS-Plugins mit demselben Namen. Es kann XML-, JSON- und CSS-Text hübsch drucken / minimieren. Eingabe und Ausgabe können Zeichenfolge / Datei in beliebigen Kombinationen sein. Es ist sehr kompakt und hat keine Abhängigkeit.
Beispiele :
quelle
Eine Alternative, wenn Sie nicht erneut analysieren möchten, ist die Bibliothek xmlpp.py mit der
get_pprint()
Funktion. Für meine Anwendungsfälle funktionierte es gut und reibungslos, ohne dass ein lxml-ElementTree-Objekt erneut analysiert werden musste.quelle
Sie können diese Variante ausprobieren ...
Installieren Sie
BeautifulSoup
die Backend-lxml
Bibliotheken (Parser):Verarbeiten Sie Ihr XML-Dokument:
quelle
'lxml'
verwendet den HTML- Parser von lxml - siehe BS4- Dokumente . Sie benötigen'xml'
oder'lxml-xml'
für den XML-Parser.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
) manipuliert , und dann haben sie sie noch am selben Tag abgelehnt. Ich habe eine offizielle Beschwerde bei S / O eingereicht, aber sie haben sich geweigert, Nachforschungen anzustellen. Wie auch immer, ich habe seitdem meine Antwort "manipuliert", die jetzt wieder korrekt ist (undlxml-xml
wie ursprünglich angegeben angibt ). Vielen Dank.Ich hatte dieses Problem und löste es so:
In meinem Code heißt diese Methode folgendermaßen:
Dies funktioniert nur, weil etree standardmäßig
two spaces
zum Einrücken verwendet , was die Einrückung nicht sehr hervorhebt und daher nicht schön ist. Ich konnte keine Einstellung für etree oder Parameter für eine Funktion zum Ändern des Standard-etree-Einzugs festlegen. Mir gefällt, wie einfach es ist, etree zu verwenden, aber das hat mich wirklich geärgert.quelle
Zum Konvertieren eines gesamten XML-Dokuments in ein hübsches XML-Dokument
(z. B. vorausgesetzt, Sie haben eine .odt- oder .ods-Datei von LibreOffice Writer extrahiert [entpackt] und möchten die hässliche Datei "content.xml" in eine hübsche Datei konvertieren automatisierte Git-Versionskontrolle und
git difftool
Ing von .odt / .ods-Dateien , wie ich sie hier implementiere )Referenzen:
- Dank der Antwort von Ben Noland auf dieser Seite, die mich den größten Teil des Weges dorthin gebracht hat.
quelle
Es funktioniert gut für die XML mit Chinesisch!
quelle
Wenn Sie aus irgendeinem Grund keines der von anderen Benutzern erwähnten Python-Module in die Hände bekommen können, empfehle ich die folgende Lösung für Python 2.7:
Soweit ich weiß, funktioniert diese Lösung auf Unix-basierten Systemen, auf denen das
xmllint
Paket installiert ist.quelle
check_output
weil Sie keine Fehlerprüfung durchführen müssenIch löste dies mit einigen Codezeilen, öffnete die Datei, ging sie durch, fügte Einrückungen hinzu und speicherte sie dann erneut. Ich habe mit kleinen XML-Dateien gearbeitet und wollte keine Abhängigkeiten oder mehr Bibliotheken hinzufügen, die für den Benutzer installiert werden sollen. Wie auch immer, hier ist, was ich am Ende hatte:
Es funktioniert für mich, vielleicht wird jemand davon Gebrauch machen :)
quelle