【Perl】 XMLを使ってみよう
XML::Simpleモジュール
◆XMLデータの読み込み
XML::Simpleモジュールの XMLin() を使用します。
XMLの読み込み
・1次元データ
person.xml
<person>
<name>Taro YAMAMOTO</name>
<tel>000-000-0000</tel>
<email>taro_yamamoto@example.com</email>
</person>
person.pl
、、、
use XML::Simple;
、、、
my $rPerson = XMLin('person.xml')
、、、
実行すると、XMLデータがハッシュとして読み込まれ、$rPersonにはこのハッシュのリファレンスが入る。
値は以下のようになる。
$$rPerson{name} = Taro YAMAMOTO
$$rPerson{tel} = 000-000-0000
$$rPerson{email} = taro_yamamoto@example.com
参考
リファレンス - 2部 Perl言語仕様 - [SMART]
・2次元データ
<NameList>
<Member>
<Name>Ichiro Suzuki</Name>
<Tel>090-1111-1111</Tel>
<Mail>itiro@hoge.co.jp</Mail>
</Member>
<Member>
<Name>Jiro Sato</Name>
<Tel>090-2222-2222</Tel>
<Mail>jiro@hoge.co.jp</Mail>
</Member>
<Member>
<Name>Sabro Yamada</Name>
<Tel>090-3333-3333</Tel>
<Mail>sabro@hoge.co.jp</Mail>
</Member>
</NameList>
実行すると値は以下のようになる。
$$rData{Member}[0]{Name} = Ichiro Suzuki
$$rData{Member}[0]{Tel} = 090-1111-1111
$$rData{Member}[0]{Mail} = itiro@hoge.co.jp
$$rData{Member}[1]{Name} = Jiro Sato
$$rData{Member}[1]{Tel} = 090-2222-2222
$$rData{Member}[1]{Mail} = jiro@hoge.co.jp
$$rData{Member}[2]{Name} = Sabro Yamada
$$rData{Member}[2]{Tel} = 090-3333-3333
$$rData{Member}[2]{Mail} = sabro@hoge.co.jp
・属性値
books2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book
name="分かる Perl"
author="野村"/>
<book
name="Perl これだけ"
author="砂川"/>
<book
name="Perl 図解"
author="和久井"/>
<book
name="最新 Perl"
author="野村"/>
<book
name="Perl 決定版"
author="和久井"/>
</books>
books2.pl
use XML::Simple;
use Data::Dumper;
{
package Data::Dumper;
sub qquote { return shift; }
}
$Data::Dumper::Useperl = 1;
use strict;
use warnings;
use utf8;
binmode(STDOUT,":encoding(sjis)");
my $rBooks;
my $ele;
my $ele2;
my @books = ();
$rBooks = XMLin('books2.xml');
print Dumper($rBooks);
print "\n";
foreach my $ele (keys(%{$rBooks})) {
foreach my $ele2 (keys(%{$rBooks->{$ele}})) {
print "書名: 『",$ele2,"』\t";
print "著者名: ",$rBooks->{$ele}->{$ele2}->{author},"\n";
if ($rBooks->{$ele}->{$ele2}->{author} eq "野村") {
push(@books, $ele2);
}
}
}
print "\n";
print "著者が野村さんの書名: \n";
foreach my $book (@books) {
print "『$book』\n";
}
実行結果
>perl books2.pl
$VAR1 = {
'book' => {
最新 Perl => {
'author' => 野村
},
Perl 決定版 => {
'author' => 和久井
},
Perl 図解 => {
'author' => 和久井
},
Perl これだけ => {
'author' => 砂川
},
分かる Perl => {
'author' => 野村
}
}
};
書名: 『最新 Perl』 著者名: 野村
書名: 『Perl 決定版』 著者名: 和久井
書名: 『Perl 図解』 著者名: 和久井
書名: 『Perl これだけ』 著者名: 砂川
書名: 『分かる Perl』 著者名: 野村
著者が野村さんの書名:
『最新 Perl』
『分かる Perl』
参考
foreach my $ele (keys(%{$rMember})) {
use Data::Dumper;
{
package Data::Dumper;
sub qquote { return shift; }
}
$Data::Dumper::Useperl = 1;
Data::DumperでUTF-8フラグつき文字列をエスケープさせないようにするには - ku