Python XMLからJSON、XMLからDictへ

今日は、PythonでXMLをJSONおよびXMLをDictに変換する方法を学びます。XMLファイルを読み取り、DictまたはJSONデータに変換するために、Pythonのxmltodictモジュールを使用できます。また、大きなXMLファイルをストリーミングし、それらを辞書に変換することもできます。コーディングの部分に入る前に、なぜXML変換が必要なのかをまず理解しましょう。

XMLをDict/JSONに変換

XMLファイルは徐々に時代遅れになっていますが、まだこの形式を使用しているウェブ上のかなり大きなシステムがあります。XMLはJSONよりも重いため、ほとんどの開発者は後者をアプリケーションで好む傾向があります。アプリケーションが任意のソースから提供されたXMLを理解する必要がある場合、それをJSONに変換するのは手間がかかる場合があります。Pythonのxmltodictモジュールは、このタスクを非常に簡単かつ直感的に実行できるようにします。

xmltodictの使用を開始する

pipを主に使用してインストールを実行します。

xmltodictモジュールのインストール

xmltodictモジュールをPythonパッケージインデックス(pip)を使用してインストールする方法は次のとおりです:

pip install xmltodict

これはxmltodictが非常に軽量なモジュールであるため、すぐに完了します。このインストールの出力は次のとおりです:このインストールの最良の点は、このモジュールが他の外部モジュールに依存していないため、軽量でバージョンの競合を回避できることです。デモンストレーションのために、Debianベースのシステムでは、このモジュールを簡単にaptツールを使用してインストールできます:

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)))

このプログラムの出力を見てみましょう:ここでは、単純にparse(...)関数を使用してXMLデータをJSONに変換し、次にjsonモジュールを使用してJSONをより良い形式で表示します。

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))

このプログラムの出力を見てみましょう:ここでは、別のモジュールpprintを使用して出力を整形して表示しました。それ以外にも、open(...)関数を使用することは直感的で、ファイルディスクリプタを取得してからファイルをJSONオブジェクトにパースしました。

PythonのXMLを辞書に

モジュール名が示すように、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))

このプログラムの出力を見てみましょう:この機能を正しく動作させるには、単一のJSONキーを提供することが必要です。データの最初のレベルに複数のJSONキーを含むようにプログラムを変更した場合を考えてみましょう:

import xmltodict

student = {
    "name" : "Shubham",
    "marks" : {
        "math" : 92,
        "english" : 99
    },
    "id" : "s387hs3"
}

print(xmltodict.unparse(student, pretty=True))

この場合、ルートレベルに3つのキーがあります。この形式のJSONをアンパースしようとすると、このエラーに直面します:これは、xmltodictが最初のキーをルートXMLタグとしてJSONを構築する必要があるためです。つまり、データのルートレベルには単一のJSONキーのみが存在するべきです。

結論

このレッスンでは、XMLをJSONに変換し、その逆も可能な優れたPythonモジュールについて学びました。また、xmltodictモジュールを使用してXMLをDictに変換する方法も学びました。参考:APIドキュメント

Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict