XML::LibXML::Simpleを使ってみる
XMLファイルを読み込んで、マップ形式で表示してみる。
ソースコードは以下の通り
use strict; use warnings; use utf8; use IO::File; use XML::LibXML::Simple; use Data::Dumper; binmode STDIN, ':utf8'; binmode STDOUT, ':utf8'; binmode STDERR, ':utf8'; # Input Check if (@ARGV != 1) { print STDERR "Please input XML file name.\n"; exit 1; } my $xmlin_name = $ARGV[0]; # File Check unless (-f $xmlin_name) { print STDERR "$xmlin_name is not found.\n"; exit 1; } # Input XML my $fh = IO::File->new($xmlin_name, 'r'); my $xml_parser = XML::LibXML::Simple->new(); my $xml = $xml_parser->XMLin($fh, KeepRoot => 1, ForceArray => 1, ForceContent => 1); $fh->close; print Dumper($xml); my $persons = $xml->{'addressBook'}[0]{'person'}; # Output XML Data for (my $cnt = 0; $cnt < @$persons; $cnt++) { print '(' . ($cnt + 1) . ')' . "\n"; foreach my $key (sort keys %{$persons->[$cnt]}) { print "\t" . $key . ' : ' . $persons->[$cnt]{$key}[0]{'content'} . "\n"; } } exit 0;
<?xml version="1.0" encoding="UTF-8"?> <addressBook> <person> <name>山田 太郎</name> <email>taro.yamada@xxx.com</email> <address>東京</address> </person> <person> <name>田中 次郎</name> <email>jiro.tanaka@xxx.com</email> <address>大阪</address> </person> <person> <name>阿部 三郎</name> <email>saburo.abe@xxx.com</email> <address>名古屋</address> </person> </addressBook>
実行結果(念のため、読み込んだ直後のデータをDumpする。)
$ perl input_xml_simple.pl sample.xml $VAR1 = { 'addressBook' => [ { 'person' => [ { 'email' => [ { 'content' => 'taro.yamada@xxx.com' } ], 'name' => [ { 'content' => "\x{5c71}\x{7530} \x{592a}\x{90ce}" } ], 'address' => [ { 'content' => "\x{6771}\x{4eac}" } ] }, { 'email' => [ { 'content' => 'jiro.tanaka@xxx.com' } ], 'name' => [ { 'content' => "\x{7530}\x{4e2d} \x{6b21}\x{90ce}" } ], 'address' => [ { 'content' => "\x{5927}\x{962a}" } ] }, { 'email' => [ { 'content' => 'saburo.abe@xxx.com' } ], 'name' => [ { 'content' => "\x{963f}\x{90e8} \x{4e09}\x{90ce}" } ], 'address' => [ { 'content' => "\x{540d}\x{53e4}\x{5c4b}" } ] } ] } ] }; (1) address : 東京 email : taro.yamada@xxx.com name : 山田 太郎 (2) address : 大阪 email : jiro.tanaka@xxx.com name : 田中 次郎 (3) address : 名古屋 email : saburo.abe@xxx.com name : 阿部 三郎 $
DOMではなくマップとリストで管理できるのは楽かも知れない。
personタグに囲まれた要素(name,email,address)の順番が保持できないのが難点か。