Python
 Computer >> コンピューター >  >> プログラミング >> Python

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

  1. PythonでXMLを解析・編集・生成する方法|ElementTree APIの使い方を徹底解説

    Pythonの標準ライブラリに含まれるXMLパーサーは、XMLファイルから必要な情報を読み取り、抽出するための最も手軽な手段のひとつです。このチュートリアルでは、xml.etree.ElementTree(ElementTree XML API)を使って、XMLファイルの「解析」「編集」「新規作成」を行う方法を、実際のコード例とともにわかりやすく解説します。 ElementTreeは、XMLデータの抽出・解析・変換をシンプルに実現できるAPIであり、外部ライブラリをインストールすることなくすぐに使い始められるのが大きな魅力です。 それでは、さっそくElementTreeを使ったPythonのX

  2. Pythonでの画像処理入門!PillowとOpenCVで学ぶ基本操作

    Pythonには、画像処理に役立つ豊富なライブラリが用意されています。代表的なものは以下の通りです。 OpenCV − リアルタイムコンピュータビジョンを主眼とした画像処理ライブラリ。2D・3D特徴量ツールキット、顔認識やジェスチャー認識、ヒューマンコンピュータインタラクション、モバイルロボティクス、物体識別など、幅広い分野で活用されています。 NumPy / SciPy − 画像の操作や処理に利用される数値計算ライブラリ。 scikit-image − 画像処理向けの多数のアルゴリズムを提供するライブラリ。 Pillow(Python Imaging Library) − サムネイル作成、