ブログトップ 記事一覧 ログイン 無料ブログ開設

サンプルコードによるPerl入門 - ゼロからPerlを始めてプロの技術を学ぼう

ゼロから初めて、プロの実力がどんどん身につく、サンプルが豊富なPerlの入門サイト
テキスト処理ならPerlが最適。if文,for文,配列,ハッシュ,正規表現を覚えれば、ログ解析も自由自在。Webサイトを作って独自のサービスの展開も! 関数とモジュールを覚えれば業務効率が劇的に改善。初級から上級まで、Perlのすべてが学べます。情報を得るだけではなく、プロとして生きていくために、プログラミングの確かな実力を「サンプルコードによるPerl入門」で身に着けてみませんか。
Twitterフォローで、Perlの最新情報と学び方解説

2010-04-24

XML::Simple - シンプルなXMLパーサ / Perlモジュール徹底解説

 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解析

 XML::Simpleは複雑なXMLの解析には向いていません。標準的かつ高速な方法でXMLを解析したいのであればXML::LibXMLモジュールを選択することができます。XML::LibXMLはDOMツリーとしてXMLを読み込むことができます。またXPathという方法で、XMLの各要素にアクセスことができます。

 この方法はXML::Simpleに比べてコーディング量が増え、技術的にも難しいですが、用件によっては最適な方法になります。


Perlモジュール徹底解説へ

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/perlcodesample/20100424/1270894115
リンク元