この記事では、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データを生成しています。
この記事もチェック:Pythonのfpdfモジュールを使って文字列やファイルをPDFに変換する方法
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形式に戻す方法について見てきました。