昨夜のメモでは、静的に配列に値をセット(ソースに値をベタ書き)して XML 化するプログラムになっているが、実際の業務では DB から読み込んだデータを元に動的に XML データを作成するケースがほとんどだろう。
そのやり方についてもメモっとく。
ちなみに、このサンプルでは @model などの配列に値をセットして、それを For Loop の中で順次読み出し XML::Simple に食わせるためのハッシュを作成しているが、この部分はつまり DB からの SELECT 結果が 3レコードあったというケースのシミュレーションである。
#!/usr/bin/perluse XML::Simple;my @model = ('ZE91-CHINPOKO', 'ZE44-OMANTAX1', 'ZE90-KEZ00101');my @price = (23450, 1000, 5820);my @detail = ('とても素敵なラジカセ付きカメラ', 'とても素敵なレンズ', '');my $results = [];for ($i = 0; $i < 3; $i++) {my $result = {};$result->{'modelNumber'} = $model[$i];$result->{'suggestedPrice'} = $price[$i];$result->{'detailDescription'} = $detail[$i];push @$results, $result;}my $val = {'resultCode' => 0,'result' => $results};my $x = new XML::Simple;my $xml = $x->XMLout($val, RootName => 'results', NoAttr=>1);print qq(<?xml version="1.0" encoding="UTF-8" ?>\n);print $xml
この結果が
<?xml version="1.0" encoding="UTF-8" ?><results><result><detailDescription>とても素敵なラジカセ付きカメラ</detailDescription><modelNumber>ZE91-CHINPOKO</modelNumber><suggestedPrice>23450</suggestedPrice></result><result><detailDescription>とても素敵なレンズ</detailDescription><modelNumber>ZE44-OMANTAX1</modelNumber><suggestedPrice>1000</suggestedPrice></result><result><detailDescription></detailDescription><modelNumber>ZE90-KEZ00101</modelNumber><suggestedPrice>5820</suggestedPrice></result><resultCode>0</resultCode></results>
となり、つまり昨夜のメモのソースで表せば、
#!/usr/bin/perluse XML::Simple;my $val = {'resultCode' => 0,'result' => [{'modelNumber' => 'ZE91-CHINPOKO','suggestedPrice' => 234500,'detailDescription' => 'とても素敵なラジカセ付きカメラ',},{'modelNumber' => 'ZE44-OMANTAX1','suggestedPrice' => 1000,'detailDescription' => 'とても素敵なレンズ',},{'modelNumber' => 'ZE90-KEZ00101','suggestedPrice' => 5820,'detailDescription' => '',},]};my $x = new XML::Simple;my $xml = $x->XMLout($val, RootName => 'results', NoAttr=>1);print qq(<?xml version="1.0" encoding="UTF-8" ?>\n);print $xml
とベタ書きした場合と一緒である。
ちょっと配列、ハッシュ(連想配列)のリファレンスとか理解してないとわかりづらいかな?
その辺は、「サンプルコードによるPerl入門 ~ 伝統と信頼のPerlを学ぼう ~」というブログの「Perlの配列とハッシュを自由に扱う」等が大変参考になる。