Ich habe eine ganze Menge ungünstigen XML-> JSON-Codes im Web gesehen, und nachdem ich ein wenig mit den Benutzern von Stack interagiert habe, bin ich überzeugt, dass diese Menge mehr helfen kann als die ersten Seiten der Google-Ergebnisse.
Wir analysieren also einen Wetter-Feed und müssen Wetter-Widgets auf einer Vielzahl von Websites füllen. Wir suchen jetzt nach Python-basierten Lösungen.
Dieser öffentliche RSS-Feed von weather.com ist ein gutes Beispiel für das, was wir analysieren würden ( unser aktueller Feed von weather.com enthält zusätzliche Informationen aufgrund einer Partnerschaft mit ihnen ).
Wie sollten wir XML mit Python in JSON konvertieren?
xmltodict (vollständige Offenlegung: Ich habe es geschrieben) kann Ihnen helfen, Ihr XML nach diesem "Standard" in eine dikt + Liste + Zeichenfolgenstruktur zu konvertieren . Es basiert auf Expat , ist also sehr schnell und muss nicht den gesamten XML-Baum in den Speicher laden.
Sobald Sie diese Datenstruktur haben, können Sie sie in JSON serialisieren:
quelle
bs4
es die Aufgabe von XML erfüllen kann, zu diktieren, ist es extrem einfach, die Bibliothek zu verwendenSie können die xmljson- Bibliothek verwenden, um mithilfe verschiedener XML-JSON-Konventionen zu konvertieren .
Zum Beispiel dieses XML:
übersetzt über die BadgerFish-Konvention in folgendes:
und über die GData-Konvention in diese (Attribute werden nicht unterstützt):
... und über die Parker-Konvention in diese (Attribute werden nicht unterstützt):
Es ist möglich, von XML nach JSON und von JSON nach XML mit denselben Konventionen zu konvertieren:
Offenlegung: Ich habe diese Bibliothek geschrieben. Hoffe, es hilft zukünftigen Suchenden.
quelle
Wenn Sie irgendwann nur den Antwortcode anstelle aller Daten erhalten, tritt ein Fehler wie json parse auf, sodass Sie ihn als Text konvertieren müssen
quelle
Hier ist der Code, den ich dafür erstellt habe. Es gibt keine Analyse des Inhalts, nur eine einfache Konvertierung.
quelle
Es gibt eine Methode zum Transportieren von XML-basiertem Markup als JSON, mit der es verlustfrei in seine ursprüngliche Form zurückkonvertiert werden kann. Siehe http://jsonml.org/ .
Es ist eine Art XSLT von JSON. Ich hoffe, Sie finden es hilfreich
quelle
An alle, die das noch brauchen. Hier ist ein neuerer, einfacher Code für diese Konvertierung.
quelle
Vielleicht möchten Sie einen Blick auf http://designtheory.org/library/extrep/designdb-1.0.pdf werfen . Dieses Projekt beginnt mit einer XML-zu-JSON-Konvertierung einer großen Bibliothek von XML-Dateien. Bei der Konvertierung wurde viel recherchiert, und es wurde das einfachste intuitive XML -> JSON-Mapping erstellt (es wird zu Beginn des Dokuments beschrieben). Zusammenfassend können Sie alles in ein JSON-Objekt konvertieren und sich wiederholende Blöcke als Liste von Objekten einfügen.
Objekte, die Schlüssel / Wert-Paare bedeuten (Wörterbuch in Python, Hashmap in Java, Objekt in JavaScript)
Es gibt keine Zuordnung zu XML, um ein identisches Dokument zu erhalten. Der Grund dafür ist, dass nicht bekannt ist, ob ein Schlüssel / Wert-Paar ein Attribut oder ein Attribut war
<key>value</key>
, weshalb diese Informationen verloren gehen.Wenn Sie mich fragen, sind Attribute ein Hack, um zu beginnen; Andererseits funktionierten sie gut für HTML.
quelle
Nun, der wahrscheinlich einfachste Weg ist, das XML in Wörterbücher zu analysieren und es dann mit simplejson zu serialisieren.
quelle
Ich würde vorschlagen, keine direkte Konvertierung anzustreben. Konvertieren Sie XML in ein Objekt und dann vom Objekt in JSON.
Meiner Meinung nach gibt dies eine klarere Definition der Übereinstimmung von XML und JSON.
Es braucht Zeit, um richtig zu werden, und Sie können sogar Tools schreiben, die Ihnen beim Generieren eines Teils davon helfen, aber es würde ungefähr so aussehen:
quelle
Ich fand für einfache XML-Schnipsel, reguläre Ausdrücke zu verwenden würde Probleme sparen. Beispielsweise:
Um dies durch XML-Analyse zu tun, gibt es, wie @Dan sagte, keine Komplettlösung, da die Daten unterschiedlich sind. Mein Vorschlag ist, lxml zu verwenden. Obwohl lxml.objectify noch nicht fertig ist, liefert lxml.objectify recht gute Ergebnisse:
quelle
Während die eingebauten Bibliotheken für das XML-Parsing ziemlich gut sind, bin ich ein Teil von lxml .
Aber zum Parsen von RSS-Feeds würde ich Universal Feed Parser empfehlen , der auch Atom analysieren kann. Sein Hauptvorteil ist, dass es selbst die meisten missgebildeten Futtermittel verdauen kann.
Python 2.6 enthält bereits einen JSON-Parser, eine neuere Version mit verbesserter Geschwindigkeit ist jedoch als simplejson verfügbar .
Mit diesen Tools sollte das Erstellen Ihrer App nicht so schwierig sein.
quelle
Meine Antwort befasst sich mit dem spezifischen (und etwas häufigen) Fall, in dem Sie nicht wirklich die gesamte XML in JSON konvertieren müssen , sondern nur bestimmte Teile der XML durchlaufen / darauf zugreifen müssen und schnell sein müssen einfach (mit json / dict-ähnlichen Operationen).
Ansatz
Aus diesem Grund ist es wichtig zu beachten, dass das Parsen einer XML-Datei mit etree verwendet wird
lxml
ist schnell ist. Der langsame Teil in den meisten anderen Antworten ist der zweite Durchgang: Durchqueren der Etree-Struktur (normalerweise im Python-Land) und Konvertieren in JSON.Was mich zu dem Ansatz führt, den ich für diesen Fall am besten gefunden habe: Parsen der XML mit
lxml
und anschließendes Umschließen der etree-Knoten (träge), um ihnen eine diktartige Schnittstelle zu bieten.Code
Hier ist der Code:
Diese Implementierung ist nicht vollständig, z. B. werden Fälle, in denen ein Element sowohl Text als auch Attribute oder sowohl Text als auch untergeordnete Elemente enthält, nicht sauber unterstützt (nur weil ich es beim Schreiben nicht benötigt habe ...). Es sollte einfach sein um es jedoch zu verbessern.
Geschwindigkeit
In meinem speziellen Anwendungsfall, in dem ich nur bestimmte Elemente der XML verarbeiten musste, ergab dieser Ansatz eine überraschende und bemerkenswerte Beschleunigung um den Faktor 70 (!) Im Vergleich zur Verwendung von @Martin Blechs xmltodict und anschließendem direkten Durchlaufen des Diktats .
Bonus
Als Bonus erhalten wir, da unsere Struktur bereits diktiert ist, eine weitere alternative Implementierung
xml2json
kostenlos. Wir müssen nur unsere diktartige Struktur weitergebenjson.dumps
. Etwas wie:Wenn Ihre XML-Datei Attribute enthält, müssen Sie alphanumerische Zeichen verwenden
attr_prefix
Datei (z. B. "ATTR_") verwenden, um sicherzustellen, dass die Schlüssel gültige JSON-Schlüssel sind.Ich habe diesen Teil nicht bewertet.
quelle
json.dumps(tree)
heißt es, dass das Objekt vom Typ 'ETreeDictWrapper' nicht JSON-serialisierbar istWenn ich etwas mit XML in Python mache, verwende ich fast immer das lxml-Paket. Ich vermute, dass die meisten Leute lxml verwenden. Sie könnten xmltodict verwenden, müssen jedoch die Strafe für das erneute Parsen des XML zahlen.
So konvertieren Sie XML mit lxml in json:
Ich benutze die folgende Klasse in meinen Projekten. Verwenden Sie die toJson-Methode.
Die Ausgabe von der eingebauten Hauptleitung ist:
Welches ist eine Transformation dieser XML:
quelle
jsonpickle oder wenn Sie feedparser verwenden, können Sie feed_parser_to_json.py ausprobieren
quelle
Dieses Zeug hier wird aktiv gepflegt und ist bisher mein Favorit: xml2json in Python
quelle
check out lxml2json (Offenlegung: Ich habe es geschrieben)
https://github.com/rparelius/lxml2json
Es ist sehr schnell, leicht (erfordert nur lxml) und ein Vorteil ist, dass Sie die Kontrolle darüber haben, ob bestimmte Elemente in Listen oder Diktate konvertiert werden
quelle
Sie können declxml verwenden. Es verfügt über erweiterte Funktionen wie mehrere Attribute und komplexe verschachtelte Unterstützung. Sie müssen nur einen einfachen Prozessor dafür schreiben. Mit demselben Code können Sie auch wieder in JSON konvertieren. Es ist ziemlich einfach und die Dokumentation ist fantastisch.
Link: https://declxml.readthedocs.io/en/latest/index.html
quelle
Daten in Python vorbereiten : So erstellen Sie JSON vorbereiten , müssen Sie zuerst Daten in Python vorbereiten. Wir können List und Dictionary in Python verwenden, um die Daten vorzubereiten.
Python- Liste <==> JSON- Array
Python Dictionary <==> JSON- Objekt (Schlüsselwertformat) Überprüfen Sie dies für weitere Details
https://devstudioonline.com/article/create-json-and-xml-in-python
quelle
Darstellung von Daten im JSON- Format
In json stellen wir Daten im Schlüssel- und Werteformat dar
Darstellung von Daten im XML- Format
quelle