Ich habe ein Programm, das ein XML-Dokument aus einem Socket liest. Ich habe das XML-Dokument in einer Zeichenfolge gespeichert, die ich direkt in ein Python-Wörterbuch konvertieren möchte, genauso wie es in Djangos simplejson
Bibliothek gemacht wird.
Nehmen Sie als Beispiel:
str ="<?xml version="1.0" ?><person><name>john</name><age>20</age></person"
dic_xml = convert_to_dic(str)
Dann dic_xml
würde es so aussehen{'person' : { 'name' : 'john', 'age' : 20 } }
python
xml
json
dictionary
xml-deserialization
user361526
quelle
quelle
Antworten:
Dies ist ein großartiges Modul, das jemand erstellt hat. Ich habe es mehrmals benutzt. http://code.activestate.com/recipes/410469-xml-as-dictionary/
Hier ist der Code von der Website für den Fall, dass der Link schlecht wird.
Anwendungsbeispiel:
// Oder wenn Sie eine XML-Zeichenfolge verwenden möchten:
quelle
xmltodict
Bibliothek). Nachteil ist, dass Sie es selbst in Ihrem Projekt hosten müssen.cElementTree
können. Ändern Sie einfach die erste Zeile in:from xml.etree import cElementTree as ElementTree
xmltodict (vollständige Offenlegung: Ich habe es geschrieben) macht genau das:
quelle
Das folgende XML-zu-Python-diktierte Snippet analysiert Entitäten sowie Attribute, die dieser XML-zu-JSON- "Spezifikation" folgen . Es ist die allgemeinste Lösung für alle Fälle von XML.
Es ist benutzt:
Die Ausgabe dieses Beispiels (gemäß der oben verlinkten "Spezifikation") sollte sein:
Nicht unbedingt hübsch, aber eindeutig, und einfachere XML-Eingaben führen zu einfacherem JSON. :) :)
Aktualisieren
Wenn Sie das Gegenteil tun möchten , geben Sie eine XML-Zeichenfolge aus einem JSON / dict aus . Sie können Folgendes verwenden:
quelle
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
ind = { t.tag: dict( (k, v[0] if len(v) == 1 else v) for k, v in dd.iteritems() ) }
cElementTree
oder verwendet wirdlxml.etree
. Beachten Sie, dass bei Verwendung von Python 3 alle.iteritems()
geändert werden müssen.items()
(dasselbe Verhalten, aber das Schlüsselwort wurde von Python 2 in 3 geändert).Diese leichtgewichtige Version ist zwar nicht konfigurierbar, lässt sich jedoch nach Bedarf leicht anpassen und funktioniert in alten Pythons. Es ist auch starr - was bedeutet, dass die Ergebnisse unabhängig von der Existenz von Attributen gleich sind.
So:
Ergebnisse in:
quelle
Die neuesten Versionen der PicklingTools-Bibliotheken (1.3.0 und 1.3.1) unterstützen Tools zum Konvertieren von XML in ein Python-Diktat.
Der Download ist hier verfügbar: PicklingTools 1.3.1
Es gibt einiges an Dokumentation für die Wandler hier : Die Dokumentation beschreibt ausführlich alle Entscheidungen und Probleme , die auftreten, wenn zwischen XML und Python Wörterbücher (es gibt eine Reihe von Rand Fällen Umwandlung: Attribute, Listen, anonyme Listen, anonym Diktate, Auswertungen usw., die die meisten Konverter nicht verarbeiten). Im Allgemeinen sind die Konverter jedoch einfach zu bedienen. Wenn eine 'example.xml' enthält:
Um es dann in ein Wörterbuch umzuwandeln:
Es gibt Tools zum Konvertieren in C ++ und Python: C ++ und Python konvertieren indentisch, aber C ++ ist etwa 60-mal schneller
quelle
Sie können dies ganz einfach mit lxml tun. Installieren Sie es zuerst:
Hier ist eine rekursive Funktion, die ich geschrieben habe und die das schwere Heben für Sie erledigt:
Die folgende Variante behält den übergeordneten Schlüssel / das übergeordnete Element bei:
Wenn Sie nur einen Teilbaum zurückgeben und in Dikt konvertieren möchten, können Sie Element.find () verwenden , um den Teilbaum abzurufen und ihn dann zu konvertieren:
Siehe die lxml-Dokumente hier . Ich hoffe das hilft!
quelle
Haftungsausschluss: Dieser modifizierte XML-Parser wurde von Adam Clark inspiriert. Der ursprüngliche XML-Parser funktioniert in den meisten einfachen Fällen. Bei einigen komplizierten XML-Dateien funktionierte dies jedoch nicht. Ich habe den Code Zeile für Zeile getestet und schließlich einige Probleme behoben. Wenn Sie Fehler finden, lassen Sie es mich bitte wissen. Ich bin froh, das Problem zu beheben.
quelle
quelle
Der am einfachsten zu verwendende XML-Parser für Python ist ElementTree (ab 2.5x in der Standardbibliothek xml.etree.ElementTree). Ich glaube nicht, dass irgendetwas genau das tut, was Sie wollen. Es wäre ziemlich trivial, mit ElementTree etwas zu schreiben, um das zu tun, was Sie wollen, aber warum in ein Wörterbuch konvertieren und warum nicht einfach ElementTree direkt verwenden.
quelle
Der Code von http://code.activestate.com/recipes/410469-xml-as-dictionary/ funktioniert gut, aber wenn es mehrere Elemente gibt, die an einer bestimmten Stelle in der Hierarchie gleich sind, werden sie nur überschrieben.
Ich habe einen Shim dazwischen hinzugefügt, um zu sehen, ob das Element bereits vor self.update () vorhanden ist. Wenn ja, wird der vorhandene Eintrag eingeblendet und eine Liste aus dem vorhandenen und dem neuen erstellt. Alle nachfolgenden Duplikate werden der Liste hinzugefügt.
Ich bin mir nicht sicher, ob dies eleganter gehandhabt werden kann, aber es funktioniert:
quelle
Von @ K3 --- rnc Antwort (das Beste für mich) Ich habe eine kleine Änderung hinzugefügt, um ein OrderedDict aus einem XML-Text zu erhalten (manchmal ist die Reihenfolge wichtig):
Nach dem Beispiel von @ K3 --- rnc können Sie es verwenden:
Ich hoffe es hilft ;)
quelle
Hier ist ein Link zu einer ActiveState-Lösung - und der Code für den Fall, dass er wieder verschwindet.
quelle
Irgendwann musste ich XML analysieren und schreiben, das nur aus Elementen ohne Attribute bestand, sodass eine 1: 1-Zuordnung von XML zu Diktat problemlos möglich war. Dies ist, was ich mir ausgedacht habe, falls jemand anderes auch keine Attribute benötigt:
quelle
@dibrovsd: Die Lösung funktioniert nicht, wenn die XML-Datei mehr als ein Tag mit demselben Namen enthält
Aus Ihrer Sicht habe ich den Code ein wenig geändert und ihn für den allgemeinen Knoten anstelle von root geschrieben:
quelle
Ich habe eine der Antworten nach meinem Geschmack geändert und arbeite beispielsweise mit dem folgenden XML-Code, der in der Datei XML.xml gespeichert ist, um mit mehreren Werten mit demselben Tag zu arbeiten
und in Python
die Ausgabe ist
quelle
Ich habe eine rekursive Methode, um ein Wörterbuch aus einem lxml-Element zu erhalten
quelle