PythonでXMLを処理する方法:ElementTreeとDOMの基本を解説
XMLは「Extensible Markup Language(拡張可能マークアップ言語)」の略称です。主にWebページなど、データが特定の構造を持つ場面で利用されています。XMLは要素(element)で構成され、各要素は開始タグと終了タグによって定義されます。タグとは、<で始まり>で終わるマークアップ構造のことです。開始タグと終了タグに挟まれた文字列がその要素の内容となり、要素の中にさらに別の要素を含めることもできます。これらは「子要素」と呼ばれます。
サンプルXMLファイル
以下は、このチュートリアルで使用するXMLファイルの例です。チュートリアル情報をまとめたシンプルなデータ構造になっています。
<?xml version="1.0"?>
<Tutorials>
<Tutorial id="Tu101">
<author>Vicky, Matthew</author>
<title>Geo-Spatial Data Analysis</title>
<stream>Python</stream>
<price>4.95</price>
<publish_date>2020-07-01</publish_date>
<description>Learn geo Spatial data Analysis using Python.</description>
</Tutorial>
<Tutorial id="Tu102">
<author>Bolan, Kim</author>
<title>Data Structures</title>
<stream>Computer Science</stream>
<price>12.03</price>
<publish_date>2020-1-19</publish_date>
<description>Learn Data structures using different programming lanuages.</description>
</Tutorial>
<Tutorial id="Tu103">
<author>Sora, Everest</author>
<title>Analytics using Tensorflow</title>
<stream>Data Science</stream>
<price>7.11</price>
<publish_date>2020-1-19</publish_date>
<description>Learn Data analytics using Tensorflow.</description>
</Tutorial>
</Tutorials>
xml.etree.ElementTreeを使ったXMLの読み込み
xml.etree.ElementTreeモジュールを使うと、XMLファイルのルート要素にアクセスでき、そこから内部の各要素の内容を取得できます。次の例では、text属性を利用して各要素のテキスト内容を取り出しています。
コード例
import xml.etree.ElementTree as ET
xml_tree = ET.parse('E:\\TutorialsList.xml')
xml_root = xml_tree.getroot()
# ヘッダー
print('Tutorial List :')
for xml_elmt in xml_root:
for inner_elmt in xml_elmt:
print(inner_elmt.text)
実行結果
上記のコードを実行すると、次のような出力が得られます。
Tutorial List : Vicky, Matthew Geo-Spatial Data Analysis Python 4.95 2020-07-01 Learn geo Spatial data Analysis using Python. Bolan, Kim Data Structures Computer Science 12.03 2020-1-19 Learn Data structures using different programming lanuages. Sora, Everest Analytics using Tensorflow Data Science 7.11 2020-1-19 Learn Data analytics using Tensorflow.
XML属性の取得
ルートタグに含まれる属性の一覧とその値を取得することも可能です。属性を把握しておくと、XMLツリー内の移動やデータの絞り込みが格段に行いやすくなります。
コード例
import xml.etree.ElementTree as ET
xml_tree = ET.parse('E:\\TutorialsList.xml')
xml_root = xml_tree.getroot()
# ヘッダー
print('Tutorial List :')
for movie in xml_root.iter('Tutorial'):
print(movie.attrib)
実行結果
上記のコードを実行すると、次のような出力が得られます。
Tutorial List :
{'id': 'Tu101'}
{'id': 'Tu102'}
{'id': 'Tu103'}
findall()による結果のフィルタリング
findall()関数を使えば、XMLツリーから条件に合致する要素だけを抽出できます。次の例では、価格が12.03であるチュートリアルのIDを検索しています。XPath風のパス指定と条件式を組み合わせることで、柔軟なデータ抽出が実現できます。
コード例
import xml.etree.ElementTree as ET
xml_tree = ET.parse('E:\\TutorialsList.xml')
xml_root = xml_tree.getroot()
# ヘッダー
print('Tutorial List :')
for movie in xml_root.findall("./Tutorial/[price ='12.03']"):
print(movie.attrib)
実行結果
上記のコードを実行すると、次のような出力が得られます。
Tutorial List :
{'id': 'Tu102'}
DOM APIによるXMLの解析
xml.domモジュールを使ってminidomオブジェクトを作成する方法もあります。minidomオブジェクトが提供するシンプルなパーサーメソッドを使うと、XMLファイルから素早くDOMツリーを生成できます。parse(file [,parser])関数を呼び出すことで、指定したXMLファイルがDOMツリーオブジェクトとして解析されます。
コード例
from xml.dom.minidom import parse
import xml.dom.minidom
# minidomパーサーでXMLドキュメントを開く
DOMTree = xml.dom.minidom.parse('E:\\TutorialsList.xml')
collection = DOMTree.documentElement
# コレクション内のすべてのTutorialを取得
tut_list = collection.getElementsByTagName("Tutorial")
print("*****Tutorials*****")
# 各チュートリアルの詳細を表示
for tut in tut_list:
strm = tut.getElementsByTagName('stream')[0]
print("Stream: ",strm.childNodes[0].data)
prc = tut.getElementsByTagName('price')[0]
print("Price: ", prc.childNodes[0].data)
実行結果
上記のコードを実行すると、次のような出力が得られます。
*****Tutorials***** Stream: Python Price: 4.95 Stream: Computer Science Price: 12.03 Stream: Data Science Price: 7.11
-
PythonでXMLを解析・編集・生成する方法|ElementTree APIの使い方を徹底解説
Pythonの標準ライブラリに含まれるXMLパーサーは、XMLファイルから必要な情報を読み取り、抽出するための最も手軽な手段のひとつです。このチュートリアルでは、xml.etree.ElementTree(ElementTree XML API)を使って、XMLファイルの「解析」「編集」「新規作成」を行う方法を、実際のコード例とともにわかりやすく解説します。 ElementTreeは、XMLデータの抽出・解析・変換をシンプルに実現できるAPIであり、外部ライブラリをインストールすることなくすぐに使い始められるのが大きな魅力です。 それでは、さっそくElementTreeを使ったPythonのX
-
Pythonでの画像処理入門!PillowとOpenCVで学ぶ基本操作
Pythonには、画像処理に役立つ豊富なライブラリが用意されています。代表的なものは以下の通りです。 OpenCV − リアルタイムコンピュータビジョンを主眼とした画像処理ライブラリ。2D・3D特徴量ツールキット、顔認識やジェスチャー認識、ヒューマンコンピュータインタラクション、モバイルロボティクス、物体識別など、幅広い分野で活用されています。 NumPy / SciPy − 画像の操作や処理に利用される数値計算ライブラリ。 scikit-image − 画像処理向けの多数のアルゴリズムを提供するライブラリ。 Pillow(Python Imaging Library) − サムネイル作成、