Pythonのxmltodictモジュールを使ってXMLをdictに変換する方法

スポンサーリンク

この記事では、xmltodictモジュールをインストールし、Pythonプログラムでそれを使ってXMLファイルを簡単に操作する方法を紹介します。

また、XMLをPythonの辞書やJSON形式に変換する方法、およびその逆の方法も紹介します。

スポンサーリンク

pip を使って xmltodict モジュールをインストールします。

Python 3以上の場合、ターミナルからpip3コマンドを使用してxmltodictをインストールすることができます

pip3  install xmltodict

Pythonの古いバージョンでは、以下のコマンドでxmltodictをインストールすることができます

pip install xmltodict

XMLファイルとは?

XMLはextensible markup languageの略で、主にデータの保存と転送のために設計されたものです。

構造化されたデータの記述に対応した記述言語で、XMLデータを保存したり、送受信したり、表示したりするためには、他のソフトウェアを使用する必要があります。

次のXMLファイルは、年式、メーカー、モデル、色などの飛行機のデータを持っています。

<?xml version = "1.0" encoding = "utf-8"?>
<!-- xslplane.1.xml -->
<?xml-stylesheet type = "text/xsl"  href = "xslplane.1.xsl" ?>
<plane>
   <year> 1977 </year>
   <make> Cessna </make>
   <model> Skyhawk </model>
   <color> Light blue and white </color>
</plane>

以下では、この飛行機のデータを使って、Pythonの辞書やJSONに変換し、xmltodictモジュールを使ってXML形式に戻す方法を見ていきます。

How to read XML data into Python dictionary?

XMLファイルをPythonの辞書に変換するには、xmltodictモジュールの xmltodict.parse() メソッドを用います。

xmltodict.parse()`メソッドはXMLファイルを入力として受け取り、それをOrdered Dictionaryに変換します。

そして、Python辞書のコンストラクタであるdictを使用して、Ordered Dictionaryから辞書データを取り出すことができます。

#import module
import xmltodict
 
#open the file
fileptr = open("/home/aditya1117/askpython/plane.xml","r")
 
#read xml content from the file
xml_content= fileptr.read()
print("XML content is:")
print(xml_content)
 
#change xml format to ordered dict
my_ordered_dict=xmltodict.parse(xml_content)
print("Ordered Dictionary is:")
print(my_ordered_dict)
print("Year of plane is:")
print(my_ordered_dict['plane']['year'])
 
#Use contents of ordered dict to make python dictionary
my_plane= dict(my_ordered_dict['plane'])
print("Created dictionary data is:")
print(my_plane)
print("Year of plane is")
print(my_plane['year'])

結果は以下の通りです。

XML content is:
<?xml version = "1.0" encoding = "utf-8"?>
<!-- xslplane.1.xml -->
<?xml-stylesheet type = "text/xsl"  href = "xslplane.1.xsl" ?>
<plane>
   <year> 1977 </year>
   <make> Cessna </make>
   <model> Skyhawk </model>
   <color> Light blue and white </color>
</plane>
 
Ordered Dictionary is:
OrderedDict([('plane', OrderedDict([('year', '1977'), ('make', 'Cessna'), ('model', 'Skyhawk'), ('color', 'Light blue and white')]))])
Year of plane is:
1977
Created dictionary data is:
{'year': '1977', 'make': 'Cessna', 'model': 'Skyhawk', 'color': 'Light blue and white'}
Year of plane is
1977

上記の例では、xmltodict.parse() メソッドを用いてXMLフォーマットから飛行機データを抽出し、Ordered Dictionaryと辞書の両方の形式で出力することに成功しました。

Pythonの辞書をXMLに変換する方法は?

xmltodict モジュールの xmltodict.unparse() メソッドを使うと、Python 辞書を XML 形式に変換することができます

このメソッドは辞書オブジェクトを入力として受け取り、XML形式のデータを出力として返します。

唯一の制約は、XMLデータを容易にフォーマットできるように、辞書はシングルルートであるべきだということです。

そうでない場合は ValueError が発生します。

#import module
import xmltodict
 
#define dictionary with all the attributes
mydict={'plane':{'year': '1977', 'make': 'Cessna', 'model': 'Skyhawk', 'color':'Light blue and white'}}
print("Original Dictionary of plane data is:")
print(mydict)
 
#create xml format
xml_format= xmltodict.unparse(my_ordered_dict,pretty=True)
print("XML format data is:")
print(xml_format)

出力。

Original Dictionary of plane data is:
{'plane': {'year': '1977', 'make': 'Cessna', 'model': 'Skyhawk', 'color': 'Light blue and white'}}
XML format data is:
<?xml version="1.0" encoding="utf-8"?>
<plane>
        <year>1977</year>
        <make>Cessna</make>
        <model>Skyhawk</model>
        <color>Light blue and white</color>
</plane>

上記の例では、単純な Python 辞書データから XML 形式の飛行機データを作成しました。

次に、XML データを JSON 形式に変換する方法を説明します。

How to convert XML to JSON?

Pythonのxmltodictモジュールとjsonモジュールを用いると、XMLデータをJSON形式に変換することができます

この処理では、まず、xmltodict.parse() メソッドを用いて、XMLフォーマットから順序付き辞書を作成します。

次に、順序付き辞書を引数として受け取り、JSON文字列に変換する json.dumps() メソッドを用いて、順序付き辞書をJSON形式に変換します。

#import module
import xmltodict
import json
 
#open the file
fileptr = open("/home/aditya1117/askpython/plane.xml","r")
 
#read xml content from the file
xml_content= fileptr.read()
print("XML content is:")
print(xml_content)
 
#change xml format to ordered dict
my_ordered_dict=xmltodict.parse(xml_content)
print("Ordered Dictionary is:")
print(my_ordered_dict)
json_data= json.dumps(my_ordered_dict)
print("JSON data is:")
print(json_data)
x= open("plane.json","w")
x.write(json_data)
x.close()

出力。

XML content is:
<?xml version = "1.0" encoding = "utf-8"?>
<!-- xslplane.1.xml -->
<?xml-stylesheet type = "text/xsl"  href = "xslplane.1.xsl" ?>
<plane>
   <year> 1977 </year>
   <make> Cessna </make>
   <model> Skyhawk </model>
   <color> Light blue and white </color>
</plane>
 
Ordered Dictionary is:
OrderedDict([('plane', OrderedDict([('year', '1977'), ('make', 'Cessna'), ('model', 'Skyhawk'), ('color', 'Light blue and white')]))])
JSON data is:
{"plane": {"year": "1977", "make": "Cessna", "model": "Skyhawk", "color": "Light blue and white"}}

上記の例では、XMLデータを xml_content に読み込み、 xmltodict.parse() によって順序付き辞書 my_ordered_dict を生成し、 json.dumps() メソッドを用いて順序付き辞書からJSONデータを生成しています。

JSONデータをXMLに変換する方法は?

まず、JSONデータを json.load() メソッドでPythonの辞書に変換し、次に xmltodict.unparse() で辞書をXMLに変換します。

ここでも、JSONデータはルートが1つでなければならないという制約があり、そうでない場合は ValueError が発生します。

#import module
import xmltodict
import json
 
#define dictionary with all the attributes
fileptr = open("/home/aditya1117/askpython/plane.json","r")
json_data=json.load(fileptr)
print("JSON data is:")
print(json_data)
 
#create xml format
xml_format= xmltodict.unparse(json_data,pretty=True)
print("XML format data is:")
print(xml_format)

結果を出力すると、以下の様になります。

JSON data is:
{'plane': {'year': '1977', 'make': 'Cessna', 'model': 'Skyhawk', 'color': 'Light blue and white'}}
XML format data is:
<?xml version="1.0" encoding="utf-8"?>
<plane>
        <year>1977</year>
        <make>Cessna</make>
        <model>Skyhawk</model>
        <color>Light blue and white</color>
</plane>

上記の例では、 json.load() が引数としてファイルオブジェクトを受け取り、データを解析して Python 辞書を作成し、 json_data に格納しています。

次に、xmltodict.unparse() メソッドを用いて辞書をXMLファイルへ変換します。

まとめ

今回は、xmltodictモジュールを使って、XMLデータを処理する方法を紹介しました。

XMLデータをPython辞書やJSON形式に変換する方法と、XML形式に戻す方法について見てきました。

タイトルとURLをコピーしました