PythonでXMLをJSONに変換する方法と、XMLを辞書形式に変換する方法。
今日はPythonでXMLをJSONや辞書に変換する方法を学びます。Pythonのxmltodictモジュールを使ってXMLファイルを読み込み、辞書またはJSONデータに変換することができます。また、大きなXMLファイルに対してもストリーミングで処理し、辞書に変換することもできます。コーディングの前に、XML変換がなぜ必要なのかを理解しましょう。
XMLを辞書/JSONに変換する
XMLファイルは徐々に時代遅れになってきていますが、まだこの形式を使用している大規模なウェブシステムもあります。XMLはJSONよりも重く、そのため、ほとんどの開発者は自分たちのアプリケーションで後者を好んで使用します。アプリケーションがどのソースによって提供されたXMLを理解する必要がある場合、それをJSONに変換する作業は手間がかかることがあります。Pythonのxmltodictモジュールを使用すると、この作業を非常に簡単かつ直感的に行うことができます。
xmltodictを使い始める
最初にxmltodictモジュールで始めることができますが、まずインストールが必要です。インストールは主にpipを使用します。
xmltodictモジュールをインストールしてください。
Python Package Index (pip)を使用して、xmltodictモジュールをインストールする方法を以下に示します。
pip install xmltodict

sudo apt install python-xmltodict
もう一つのプラスポイントは、このモジュールに公式のDebianパッケージがあることです。
PythonのXMLをJSONに変換する
このモジュールを試す最適な場所は、主に行われるべき操作であるXMLからJSONへの変換を行うことです。これを行うためのコードスニペットを見てみましょう。
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(xmltodict.parse(my_xml)))

XMLファイルをJSONに変換する
XMLデータをコード自体に保持することは、常に可能でも現実的でもありません。通常、データはデータベースまたはファイルに保持します。また、ファイルを直接選択し、JSONに変換することもできます。XMLファイルでの変換方法について、コードの断片を見てみましょう。
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read())
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))

PythonのXMLをDictに変換
モジュール名そのものが示すように、xmltodictは提供したXMLデータを単純なPythonの辞書に変換します。そのため、辞書のキーを使用してデータに簡単にアクセスすることができます。以下はサンプルプログラムです。
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
my_dict = xmltodict.parse(my_xml)
print(my_dict['audience']['id'])
print(my_dict['audience']['id']['@what'])

XMLでネームスペースをサポートする
通常、XMLデータにはXMLファイルで提供されるデータの範囲を定義する一連の名前空間があります。JSON形式に変換する際には、これらの名前空間がJSON形式でも保持される必要があります。以下のサンプルXMLファイルを考えてみましょう。
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
以下は、JSON形式でもXML名前空間を含める方法のサンプルプログラムです。
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read(), process_namespaces=True)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))

JSONをXMLに変換
XMLをJSONに変換することがこのモジュールの主な目的ですが、xmltodictはJSONをXML形式に変換する逆の操作もサポートしています。プログラム自体にJSONデータを提供します。以下にサンプルプログラムを示します。
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))

import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))

結論
このレッスンでは、XMLをJSONに変換したり、その逆を行うために使用できる優れたPythonモジュールについて学びました。また、xmltodictモジュールを使用してXMLを辞書に変換する方法も学びました。参考資料:APIドキュメント