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

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やElementTreeiterparse)などの選択肢も検討するとよいでしょう。

DOM APIの詳細については、Python公式ドキュメントの「xml.dom」および「xml.dom.minidom」の項目を参照してください。

  1. PythonのPygameで画像を表示する方法

    Pygameは、Pythonでゲームやマルチメディアアプリケーションを開発するための定番マルチメディアライブラリです。本記事では、pygameモジュールを使用して、画像のサイズ(高さ・幅)やウィンドウ内での表示位置を考慮しながら、画面に画像を描画する方法を解説します。 画像表示の基本的な流れ 以下のサンプルプログラムでは、まずpygameモジュールを初期化し、ウィンドウのサイズとキャプション(タイトルバーの文字列)を設定します。その後、画像ファイルを読み込み、表示する座標を指定します。screen.blit()関数が実際に画面へ画像を描画し、whileループがウィンドウを閉じる操作(QUITイ

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

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