この記事では、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 moduleimport xmltodict
#open the filefileptr = open("/home/aditya1117/askpython/plane.xml","r")
#read xml content from the filexml_content= fileptr.read()
print("XML content is:")
print(xml_content)
#change xml format to ordered dictmy_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 dictionarymy_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:
1977Created 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 moduleimport xmltodict
#define dictionary with all the attributesmydict={'plane':{'year': '1977', 'make': 'Cessna', 'model': 'Skyhawk', 'color':'Light blue and white'}}
print("Original Dictionary of plane data is:")
print(mydict)
#create xml formatxml_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 moduleimport xmltodict
import json
#open the filefileptr = open("/home/aditya1117/askpython/plane.xml","r")
#read xml content from the filexml_content= fileptr.read()
print("XML content is:")
print(xml_content)
#change xml format to ordered dictmy_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データを生成しています。
この記事もチェック:Pythonのfpdfモジュールを使って文字列やファイルをPDFに変換する方法
JSONデータをXMLに変換する方法は?
まず、JSONデータを json.load() メソッドでPythonの辞書に変換し、次に xmltodict.unparse() で辞書をXMLに変換します。
ここでも、JSONデータはルートが1つでなければならないという制約があり、そうでない場合は ValueError が発生します。
#import moduleimport xmltodict
import json
#define dictionary with all the attributesfileptr = open("/home/aditya1117/askpython/plane.json","r")
json_data=json.load(fileptr)
print("JSON data is:")
print(json_data)
#create xml formatxml_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形式に戻す方法について見てきました。