Modified: 5 March 2006
"XML::SimpleObject"で属性部分を取り出す (5 March 2006)
"XML::Simple"でデータを取り出す ( 5 March 2006)
#!/usr/bin/perl -w use strict; use XML::SimpleObject; use XML::Parser; my $xmlfile = "x1.xml"; my $parser = new XML::Parser(Style=>'Tree'); my $simpleobject = new XML::SimpleObject($parser->parsefile( $xmlfile )); my @rp1 = $simpleobject->child('recipe')->child('setmenu')->child('menu'); my @rp2 = $rp1[0]->child('recipe'); foreach my $rn (@rp2) { print $rn->attribute('id')."\n"; }上記のプログラムは、以下のXMLファイルを読み込んで、"$simpleobject"を作成し、タグを外側から手繰ります。
$simpleobject->child('recipe')->child('setmenu')->child('menu');
"menu"は複数(3つ)存在するので、"@rp1" には、3つの"menu"のリファレンスが格納されます。
"$rp1[0]->child('recipe')"によって、"menu"タグの"0"番目内の4つの"recipe"タグのリファレンスが、"@rp2"に格納されます。
最後に、"recipe"タグの属性"id"を取り出して、表示します。
<recipe> <setmenu id="S002"> <menu id="M001" title="m" div="1"> <recipe id="R001">...</recipe> <recipe id="R002">...</recipe> <recipe id="R003">...</recipe> <recipe id="R004">...</recipe> </menu> <menu id="M002" title="l" div="2"> <recipe id="R005">...</recipe> <recipe id="R006">...</recipe> <recipe id="R007">...</recipe> </menu> <menu id="M003" title="d" div="3"> <recipe id="R008">...</recipe> <recipe id="R009">...</recipe> <recipe id="R010">...</recipe> <recipe id="R011">...</recipe> <recipe id="R012">...</recipe> </menu> </setmenu> </recipe>実行すると以下のようになります。
# perl -w x1.pl R001 R002 R003 R004 #
#!/usr/bin/perl -w use strict; use XML::Simple; use Data::Dumper; use XML::LibXML; my $xmlfile = "x2.xml"; my $simple = XML::Simple->new(); my $tree = $simple->XMLin( $xmlfile ); print Dumper( $tree );上記のプログラムは、以下のXMLファイルを読み込んで、"$simple"を作成し、解析されたツリー構造を、"Dumper"で表示してみます。
<recipe> <setmenu id="S002"> <menu id="M001" title="m" div="1"> <recipe id="R001">aaa</recipe> <recipe id="R002">bbb</recipe> <recipe id="R003">ccc</recipe> <recipe id="R004">ddd</recipe> </menu> <menu id="M002" title="l" div="2"> <recipe id="R005">eee</recipe> <recipe id="R006">fff</recipe> <recipe id="R007">ggg</recipe> </menu> <menu id="M003" title="d" div="3"> <recipe id="R008">hhh</recipe> <recipe id="R009">iii</recipe> <recipe id="R010">jjj</recipe> <recipe id="R011">kkk</recipe> <recipe id="R012">lll</recipe> </menu> </setmenu> </recipe>実行すると、以下のようになりました。
タグ内の"id"は、データでなくノード名になっています。
$VAR1 = { 'setmenu' => { 'menu' => { 'M003' => { 'div' => '3', 'title' => 'd', 'recipe' => { 'R012' => { 'content' => 'lll' }, 'R010' => { 'content' => 'jjj' }, 'R008' => { 'content' => 'hhh' }, 'R011' => { 'content' => 'kkk' }, 'R009' => { 'content' => 'iii' } } }, 'M002' => { 'div' => '2', 'title' => 'l', 'recipe' => { 'R006' => { 'content' => 'fff' }, 'R005' => { 'content' => 'eee' }, 'R007' => { 'content' => 'ggg' } } }, 'M001' => { 'div' => '1', 'title' => 'm', 'recipe' => { 'R003' => { 'content' => 'ccc' }, 'R001' => { 'content' => 'aaa' }, 'R004' => { 'content' => 'ddd' }, 'R002' => { 'content' => 'bbb' } } } }, 'id' => 'S002' } };所望のデータ("fff")を表示してみます。
#!/usr/bin/perl -w use strict; use XML::Simple; use Data::Dumper; use XML::LibXML; my $xmlfile = "x2.xml"; my $simple = XML::Simple->new(); my $tree = $simple->XMLin( $xmlfile ); print $tree->{'setmenu'}->{'menu'}->{'M002'}->{'recipe'}->{'R006'}->{'content'};実行すると以下のように表示できました。
# perl -w x2.pl fff #