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); }