it-swarm.com.de

Wie konvertiere ich XML nach JSON in Python?

Mögliches Duplikat:
XML mit Python in JSON konvertieren?

Ich arbeite an App Engine und muss ein XML-Dokument, das von einem Remote-Server abgerufen wird, in ein äquivalentes JSON-Objekt konvertieren.

Ich benutze xml.dom.minidom, um die von urlfetch zurückgegebenen XML-Daten zu analysieren. Ich versuche auch Django.utils.simplejson, um das analysierte XML-Dokument in JSON zu konvertieren. Ich bin völlig ratlos, wie man die beiden zusammenhält. Unten ist der Code, mit dem ich bastele:

from xml.dom import minidom
from Django.utils import simplejson as json

#pseudo code that returns actual xml data as a string from remote server. 
result = urlfetch.fetch(url,'','get');

dom = minidom.parseString(result.content)
json = simplejson.load(dom)

self.response.out.write(json)
61
Geuis

Soviuts Rat für lxml objectify ist gut. Mit einem speziell untergeordneten simplejson können Sie ein lxml objectify-Ergebnis in json umwandeln.

import simplejson as json
import lxml

class objectJSONEncoder(json.JSONEncoder):
  """A specialized JSON encoder that can handle simple lxml objectify types
      >>> from lxml import objectify
      >>> obj = objectify.fromstring("<Book><price>1.50</price><author>W. Shakespeare</author></Book>")       
      >>> objectJSONEncoder().encode(obj)
      '{"price": 1.5, "author": "W. Shakespeare"}'       
 """


    def default(self,o):
        if isinstance(o, lxml.objectify.IntElement):
            return int(o)
        if isinstance(o, lxml.objectify.NumberElement) or isinstance(o, lxml.objectify.FloatElement):
            return float(o)
        if isinstance(o, lxml.objectify.ObjectifiedDataElement):
            return str(o)
        if hasattr(o, '__dict__'):
            #For objects with a __dict__, return the encoding of the __dict__
            return o.__dict__
        return json.JSONEncoder.default(self, o)

In der Dokumentation finden Sie ein Verwendungsbeispiel. Im Wesentlichen übergeben Sie das Ergebnis von lxml objectify an die Codierungsmethode einer Instanz von objectJSONEncoder.

Beachten Sie, dass Koens Punkt hier sehr gültig ist. Die obige Lösung funktioniert nur für einfach verschachtelte XML-Dateien und enthält nicht den Namen der Stammelemente. Dies könnte behoben werden.

Ich habe diese Klasse hier in eine Liste aufgenommen: http://Gist.github.com/345559

25
Anton I. Sipos

xmltodict (vollständige Offenlegung: Ich habe es geschrieben) kann Ihnen helfen, Ihr XML in eine Dict + List + String-Struktur zu konvertieren, indem Sie diesem "Standard" folgen. 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:

import xmltodict, json

o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>')
json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
74
Martin Blech

Ich denke, das XML-Format kann so vielfältig sein, dass es unmöglich ist, einen Code zu schreiben, der dies ohne ein sehr genau definiertes XML-Format ermöglicht. Hier ist was ich meine:

<persons>
    <person>
        <name>Koen Bok</name>
        <age>26</age>
    </person>
    <person>
        <name>Plutor Heidepeen</name>
        <age>33</age>
    </person>
</persons>

Würde werden

{'persons': [
    {'name': 'Koen Bok', 'age': 26},
    {'name': 'Plutor Heidepeen', 'age': 33}]
}

Aber was wäre das:

<persons>
    <person name="Koen Bok">
        <locations name="defaults">
            <location long=123 lat=384 />
        </locations>
    </person>
</persons>

Verstehst du, was ich meine?

Bearbeiten: habe gerade diesen Artikel gefunden: http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html

14
Koen Bok

Jacob Smullyan hat ein Hilfsprogramm namens pesterfish geschrieben, das Effbots ElementTree verwendet, um XML in JSON zu konvertieren.

8
Jeff Bauer

Eine Möglichkeit wäre, Objectify oder ElementTree aus dem lxml-Modul zu verwenden. Eine ältere Version von ElementTree ist auch im Modul python xml.etree verfügbar. In beiden Fällen wird Ihre XML in Python Objekte konvertiert, die Sie dann mit simplejson in JSON serialisieren können.

Dies mag zwar als schmerzhafter Zwischenschritt erscheinen, macht aber mehr Sinn, wenn Sie sowohl mit XML als auch mit normalem Python arbeiten. Objekte.

4
Soviut

Ich habe ein kleines, auf der Kommandozeile basierendes Python auf pesterfesh basierendes Skript geschrieben, das genau dies tut:

https://github.com/hay/xml2json

1
Husky

Im Allgemeinen möchten Sie von XML zu regulären Objekten Ihrer Sprache wechseln (da dies in der Regel mit vernünftigen Tools möglich ist und die Konvertierung schwieriger ist). Und dann aus Plain Old Object JSON erzeugen - es gibt auch Werkzeuge dafür, und es ist eine recht einfache Serialisierung (da JSON "Objektnotation" ist, natürliche Eignung zum Serialisieren von Objekten). Ich gehe davon aus, dass Python seine Werkzeuge hat.

1
StaxMan