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

PythonのExpatモジュールを使った高速XML解析の基本と実装例

Pythonには、XMLデータを読み込んで処理するための標準モジュールとしてexpatが用意されています。expatは「非検証型(non-validating)」のXMLパーサーであり、軽量かつ高速に動作するのが特徴です。仕組みとしては、まずXMLパーサーオブジェクトを生成し、そのオブジェクトが持つ各種イベントをハンドラ関数に紐付けて処理を行います。

本記事では、ハンドラ関数を活用してXMLファイルから要素や属性値を読み取り、出力データとして取得する方法を具体例とともに解説します。ここで生成したデータは、その後のさまざまな処理に利用できます。

Expatの主なハンドラ関数

expatでは、XMLの解析中に発生するイベントごとにコールバック関数(ハンドラ)を登録します。代表的なハンドラは以下の3つです。

  • StartElementHandler:開始タグを検出したときに呼ばれ、タグ名と属性の辞書を受け取る
  • EndElementHandler:終了タグを検出したときに呼ばれ、タグ名を受け取る
  • CharacterDataHandler:要素内のテキスト(文字データ)を検出したときに呼ばれる

実装例

以下のコードでは、最初の要素・最後の要素・文字データをそれぞれキャプチャするハンドラ関数を定義し、パーサーに登録しています。

import xml.parsers.expat

# 最初の要素をキャプチャ
def first_element(tag, attrs):
    print('first element:', tag, attrs)

# 最後の要素をキャプチャ
def last_element(tag):
    print('last element:', tag)

# 文字データをキャプチャ
def character_value(value):
    print('Character value:', repr(value))

parser_expat = xml.parsers.expat.ParserCreate()
parser_expat.StartElementHandler = first_element
parser_expat.EndElementHandler = last_element
parser_expat.CharacterDataHandler = character_value
parser_expat.Parse(""" <?xml version="1.0"?>
<parent student_rollno="15">
<child1 Student_name="Krishna"> Strive for progress, not perfection</child1>
<child2 student_name="vamsi"> There are no shortcuts to any place worth going</child2>
</parent>""", 1)

実行結果

上記のコードを実行すると、次のような結果が出力されます。

first element: parent {'student_rollno': '15'}
Character value: '\n'
first element: child1 {'Student_name': 'Krishna'}
Character value: 'Strive for progress, not perfection'
last element: child1
Character value: '\n'
first element: child2 {'student_name': 'vamsi'}
Character value: ' There are no shortcuts to any place worth going'
last element: child2
Character value: '\n'
last element: parent

ポイントのまとめ

  • ParserCreate()でパーサーオブジェクトを生成し、Parse()メソッドにXML文字列を渡すだけで解析が開始される
  • 第2引数に1(True)を指定すると、入力が最後まで完了したことを示す「isfinal」フラグが立ち、解析が確定する
  • 改行文字('\n')も文字データとして検出されるため、実務では空白や改行を適宜フィルタリングするとよい

このようにexpatを使えば、DOMのように木構造全体をメモリに展開することなく、イベント駆動型で効率よくXMLを処理できます。大きなXMLファイルを扱う場合や、必要な要素だけを抽出したい場合に特に有効な手法です。

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

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

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c