XML::Simple - 簡単にXMLを解析
XML::Simpleモジュールを使うと簡単にXMLを解析してPerlのデータ構造に変換することができます。XMLの解析手法には「先頭から順次解析を行うSAX」と「XMLツリー構造を構築するDOM」が有名ですが、簡単に扱うという点では、XML::Simpleが一番です。
XMLはテキストファイルにデータを記述するときの一般的なフォーマットです。プログラムの設定ファイルを記述するときなどに利用することができます。
# モジュールの読み込みとオブジェクトの生成 use XML::Simple; my $xml = XML::Simple->new;
XMLファイルを読み込むにはXMLinメソッドを使用します。XMLはPerlのデータ構造(多次元のハッシュや配列)に変換されます。
# XMLファイルのパース my $data = $xml->XMLin('conf.xml');
設定ファイルのXMLのサンプルです。複数システムにある複数のログを編集するアプリケーションを想定しています。ファイルはUTF-8で保存してください。
<?xml version="1.0" encoding="UTF-8" ?> <conf> <!-- Version 1.01 --> <!-- アプリケーションのホームディレクトリ --> <app-home-dir>c:\apphome</app-home-dir> <!-- ライブラリのディレクトリ --> <lib-dir>lib</lib-dir> <!-- ログを格納するディレクトリ --> <log-dir>log</log-dir> <!-- システムの種類 --> <system>xxx yyy zzz</system> <!-- ログの種類 --> <log-types> <cpu script="parse_cpu.pl" from-dir="raw/cpu" to-dir="edit/cpu" /> <mem script="parse_mem.pl" from-dir="raw/mem" to-dir="edit/mem" /> <gclog script="parse_gclog.pl" from-dir="raw/gclog" to-dir="edit/gclog" /> </log-types> </conf>
このファイルは次のようなデータ構造に変換されます。
▼
$conf = { 'log-types' => { 'cpu' => { 'to-dir' => 'edit/cpu', 'script' => 'parse_cpu.pl', 'from-dir' => 'raw/cpu' }, 'gclog' => { 'to-dir' => 'edit/gclog', 'script' => 'parse_gclog.pl', 'from-dir' => 'raw/gclog' }, 'mem' => { 'to-dir' => 'edit/mem', 'script' => 'parse_mem.pl', 'from-dir' => 'raw/mem' } }, 'system' => 'xxx yyy zzz', 'log-dir' => 'log', 'app-home-dir' => 'c:\\apphome', 'lib-dir' => 'lib' };
XML::Simpleでの日本語の扱い
XMLinで日本語を含む文字列を読み込んだ場合は、XML宣言のencoding属性で指定された文字コードから内部文字列に変換されます。バイト文字列のままではないので注意してください。
<?xml version="1.0" encoding="UTF-8" ?> <conf> <name>増田</name> </conf>
内部文字列に変換されていますので、出力したい場合などはEncodeモジュールのencode関数を使ってバイト文字列に変換する必要があります。
# 出力するときは内部文字列からバイト文字列へ変換 use Encode 'encode'; my $conf = $xml->XMLin('japanese.xml'); print encode('UTF-8', $conf->{name});
XML::Simpleのオプション
XML::Simpleはコンストラクタの引数にオプションを指定することができます。
# オプション my $xml = XML::Simple->new(ForceArray => 1);
次の二つのオプションは使用頻度が高いかもしれません。
オプション名 | 解説 |
ForceArray | 入れ子の要素を必ず配列のリファレンスにする |
KeyAttr | 指定した属性をハッシュのキーとして扱う |
XML::LibXML - 標準的で高速なXML解析
XML::Simpleは複雑なXMLの解析には向いていません。標準的かつ高速な方法でXMLを解析したいのであればXML::LibXMLモジュールを選択することができます。XML::LibXMLはDOMツリーとしてXMLを読み込むことができます。またXPathという方法で、XMLの各要素にアクセスことができます。
この方法はXML::Simpleに比べてコーディング量が増え、技術的にも難しいですが、用件によっては最適な方法になります。
CentOSでXML::LibXMLモジュールがインストールできない場合の対処
CentOSでXML::LibXMLモジュールのインストールに失敗する場合はlibxml2-develパッケージが足りないのでインストールしましょう。
yum -y install libxml2-devel