PythonのDOM APIでXMLを解析する方法|minidomの基本とサンプルコード
DOM(Document Object Model)とは
Document Object Model(DOM)は、World Wide Web Consortium(W3C)が策定した、XML文書へアクセスし内容を変更するためのクロス言語APIです。
DOMは、ランダムアクセスが必要なアプリケーションにとって非常に有用です。SAXでは文書を一度に少しずつしか読み進められず、ある要素を処理している間は他の要素へアクセスできません。その点、DOMは文書全体をツリー構造としてメモリ上に展開するため、任意のノードに自由にアクセスできます。
minidomモジュールでXMLを読み込む
XML文書を手軽に読み込んでminidomオブジェクトを作成するには、標準ライブラリのxml.dom.minidomモジュールを使います。minidomオブジェクトはシンプルなパース用メソッドを備えており、XMLファイルから短いコードでDOMツリーを生成できます。
以下のサンプルでは、minidomオブジェクトのparse(file)関数を呼び出し、引数fileで指定したXMLファイルを解析して、DOMツリーオブジェクトを作成しています。
前提となるXMLファイル(movies.xml)
この例では、次のような構造を持つ「movies.xml」を使用します。
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<rating>PG</rating>
<description>Talk about a US-Japan war</description>
</movie>
<!-- 以降も同様の movie 要素が続く -->
</collection>サンプルコード(Python 3)
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# minidomパーサーでXML文書を開く
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print("ルート要素 : %s" % collection.getAttribute("shelf"))
# コレクション内のすべての映画を取得
movies = collection.getElementsByTagName("movie")
# 各映画の詳細を出力
for movie in movies:
print("*****Movie*****")
if movie.hasAttribute("title"):
print("タイトル: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print("ジャンル: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print("フォーマット: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print("レーティング: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print("説明: %s" % description.childNodes[0].data)実行結果
このプログラムを実行すると、次のような出力が得られます。
ルート要素 : New Arrivals *****Movie***** タイトル: Enemy Behind ジャンル: War, Thriller フォーマット: DVD レーティング: PG 説明: Talk about a US-Japan war *****Movie***** タイトル: Transformers ジャンル: Anime, Science Fiction フォーマット: DVD レーティング: R 説明: A schientific fiction *****Movie***** タイトル: Trigun ジャンル: Anime, Action フォーマット: DVD レーティング: PG 説明: Vash the Stampede! *****Movie***** タイトル: Ishtar ジャンル: Comedy フォーマット: VHS レーティング: PG 説明: Viewable boredom
コードのポイント解説
- documentElement:XML文書のルート要素(ここでは
collection)を取得します。 - hasAttribute / getAttribute:属性の有無を確認したうえで、値を安全に取り出せます。
- getElementsByTagName:指定したタグ名の要素をすべてリストで取得します。インデックス
[0]で最初の要素にアクセスしています。 - childNodes[0].data:要素内のテキストノードの内容を参照します。
注意点
minidomは手軽な反面、文書全体をメモリに読み込むため、非常に大きなXMLファイルを扱う場合にはメモリ消費量に注意が必要です。大規模なデータを逐次処理したい場合は、SAXやElementTree(iterparse)などの選択肢も検討するとよいでしょう。
DOM APIの詳細については、Python公式ドキュメントの「xml.dom」および「xml.dom.minidom」の項目を参照してください。
-
PythonのPygameで画像を表示する方法
Pygameは、Pythonでゲームやマルチメディアアプリケーションを開発するための定番マルチメディアライブラリです。本記事では、pygameモジュールを使用して、画像のサイズ(高さ・幅)やウィンドウ内での表示位置を考慮しながら、画面に画像を描画する方法を解説します。 画像表示の基本的な流れ 以下のサンプルプログラムでは、まずpygameモジュールを初期化し、ウィンドウのサイズとキャプション(タイトルバーの文字列)を設定します。その後、画像ファイルを読み込み、表示する座標を指定します。screen.blit()関数が実際に画面へ画像を描画し、whileループがウィンドウを閉じる操作(QUITイ
-
PythonでXMLを解析・編集・生成する方法|ElementTree APIの使い方を徹底解説
Pythonの標準ライブラリに含まれるXMLパーサーは、XMLファイルから必要な情報を読み取り、抽出するための最も手軽な手段のひとつです。このチュートリアルでは、xml.etree.ElementTree(ElementTree XML API)を使って、XMLファイルの「解析」「編集」「新規作成」を行う方法を、実際のコード例とともにわかりやすく解説します。 ElementTreeは、XMLデータの抽出・解析・変換をシンプルに実現できるAPIであり、外部ライブラリをインストールすることなくすぐに使い始められるのが大きな魅力です。 それでは、さっそくElementTreeを使ったPythonのX