カスタム検索
このエントリーをはてなブックマークに追加
tomo.gif (1144 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)To previous pageTo home pageMailing to me

XMLを処理する話題

Modified: 5 March 2006


"XML::SimpleObject"で属性部分を取り出す (5 March 2006
"XML::Simple"でデータを取り出す ( 5 March 2006


"XML::SimpleObject"で属性部分を取り出す 

#!/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
#

"XML::Simple"でデータを取り出す 

#!/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
#

To previous pageTo home pageMailing to meJump to Top of pageline.gif (927 ツバツイツト)line.gif (927 ツバツイツト)tomo.gif (1144 ツバツイツト)
カスタム検索



このエントリーをはてなブックマークに追加