tetsunosukeのnotebook

tetsunosukeのメモです

XML::Parserを使ってXMLを解析する

"XMLファイルの属性値を一覧にするPerlスクリプトを作りたいです。"って質問があったので考えてみた。

以下そのスクリプト。

基本は"以前"書いたのと同じ考え方で、要素を開いたらその要素を配列(スタック)に突っ込んで、閉じるときはそれを戻すことによって、実現する。

XML::Parserのドキュメントって確かにぜんぜんなくて、属性、属性値をどう複数取り出すのかがわからなくてがんがんData::Dumperで出してみたらわかった。

use strict;
use warnings;

use XML::Parser;

our @elements;

my $parser = new XML::Parser;
$parser->setHandlers(
  Start => \&start_handler,
  End => \&end_handler,
);
$parser->parsefile('test.xml');

##
# 要素開始時に呼び出される。
# その要素内の属性を解析し、要素名をスタックの配列に追加
# 要素、属性を表示する。
sub start_handler{
  # 最初の引数は捨てる
  shift;
  my $elem = shift;
  
  ## 属性名=>属性値のハッシュになる
  my %attrs = @_;
  
  ## 要素名をスタックに入れる
  push(@elements, $elem);
  
  # 要素名の書き出し
  for(my $i=0;$i < $#elements;$i++){
    print "$elements[$i].";
  }
  print "$elements[$#elements]:";
  
  # ハッシュの中の属性名、属性値を書き出し
  while((my $name, my $value) = each(%attrs)){
    print "$name=$value;";
  }
  print "\n";
}

##
# 要素終了時に呼び出される。
# スタックから該当要素を捨てる
sub end_handler{
  # 最初の引数は捨てる
  shift;
  # 次も要素名なのでいらない
  shift;
  # スタックから要素を一つ減らす
  pop(@elements);
  
}