可能性のある複製:
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)
ソビエトの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
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"]}}'
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
Jacob Smullyanは、effbotの ElementTree を使用してXMLをJSONに変換する pesterfish というユーティリティを作成しました。
1つの可能性は、ObjectifyまたはElementTreeを lxmlモジュール から使用することです。古いバージョンのElementTreeは、python xml.etreeモジュールでも利用できます。これらのいずれかは、xmlをPythonオブジェクトに変換します。 simplejson を使用して、オブジェクトをJSONにシリアル化します。
これは苦痛な中間ステップのように思えるかもしれませんが、XMLとnormal Pythonオブジェクト。
Pythonこれを正確に行うpesterfeshに基づくスクリプトをベースにした小さなコマンドラインを作成しました。
一般に、XMLから言語の通常のオブジェクトに移動する必要があります(通常、これを行うための合理的なツールがあり、変換が難しいため)。そして、Plain Old ObjectからJSONを生成します-このためのツールもあり、それは非常に単純なシリアル化です(JSONはオブジェクトのシリアル化に自然に適合する「オブジェクト表記法」であるため)。 Pythonにはツールのセットがあります。