web-dev-qa-db-ja.com

PythonでXMLをJSONに変換する方法は?

可能性のある複製:
Pythonを使用してXMLをJSONに変換しますか?

App Engineでいくつかの作業を行っていますが、リモートサーバーから取得したXMLドキュメントを同等のJSONオブジェクトに変換する必要があります。

urlfetchによって返されるXMLデータを解析するためにxml.dom.minidomを使用しています。また、Django.utils.simplejsonを使用して、解析されたXMLドキュメントをJSONに変換しようとしています。この2つを結び付ける方法については、完全に迷っています。以下は私がいじっているコードです:

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

ソビエトのlxml objectifyに関するアドバイスは良いものです。特別にサブクラス化されたsimplejsonを使用すると、lxmlのオブジェクト化結果をjsonに変換できます。

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)

使用例については、docstringを参照してください。基本的に、lxml objectifyの結果をobjectJSONEncoderのインスタンスのエンコードメソッドに渡します。

Koenのポイントはここでは非常に有効であることに注意してください。上記のソリューションは、単純にネストされたxmlでのみ機能し、ルート要素の名前は含まれません。これは修正できます。

このクラスをGistに含めました: http://Gist.github.com/345559

25
Anton I. Sipos

xmltodict (完全開示:私が書いた)は、XMLをdict + list + string構造に変換するのに役立ちます。これは "standard" に従います。 Expat -basedであるため、非常に高速であり、XMLツリー全体をメモリにロードする必要はありません。

そのデータ構造を取得したら、それをJSONにシリアル化できます。

import xmltodict, json

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

XML形式は非常に多様であるため、非常に厳密に定義されたXML形式なしでこれを実行できるコードを記述することは不可能だと思います。ここに私が意味するものがあります:

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

になるだろう

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

しかし、これは何でしょうか:

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

意味がわかりますか?

編集:この記事が見つかりました: http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html

14
Koen Bok

Jacob Smullyanは、effbotの ElementTree を使用してXMLをJSONに変換する pesterfish というユーティリティを作成しました。

8
Jeff Bauer

1つの可能性は、ObjectifyまたはElementTreeを lxmlモジュール から使用することです。古いバージョンのElementTreeは、python xml.etreeモジュールでも利用できます。これらのいずれかは、xmlをPythonオブジェクトに変換します。 simplejson を使用して、オブジェクトをJSONにシリアル化します。

これは苦痛な中間ステップのように思えるかもしれませんが、XMLnormal Pythonオブジェクト。

4
Soviut

Pythonこれを正確に行うpesterfeshに基づくスクリプトをベースにした小さなコマンドラインを作成しました。

https://github.com/hay/xml2json

1
Husky

一般に、XMLから言語の通常のオブジェクトに移動する必要があります(通常、これを行うための合理的なツールがあり、変換が難しいため)。そして、Plain Old ObjectからJSONを生成します-このためのツールもあり、それは非常に単純なシリアル化です(JSONはオブジェクトのシリアル化に自然に適合する「オブジェクト表記法」であるため)。 Pythonにはツールのセットがあります。

1
StaxMan