Perl: 2014年10月アーカイブ

昨夜のメモでは、静的に配列に値をセット(ソースに値をベタ書き)して XML 化するプログラムになっているが、実際の業務では DB から読み込んだデータを元に動的に XML データを作成するケースがほとんどだろう。
そのやり方についてもメモっとく。

ちなみに、このサンプルでは @model などの配列に値をセットして、それを For Loop の中で順次読み出し XML::Simple に食わせるためのハッシュを作成しているが、この部分はつまり DB からの SELECT 結果が 3レコードあったというケースのシミュレーションである。

#!/usr/bin/perl

use 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/perl

use 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 で XML ファイルを扱うのでメモ。

例えば問い合わせに対して商品データを XML データで返す。

#!/usr/bin/perl

use XML::Simple;

my $val = {
'resultCode' => 0,
'result' => {
'modelNumber' => 'ZE91-CHINPOKO',
'suggestedPrice' => 234500,
'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

この出力結果が、

<?xml version="1.0" encoding="UTF-8" ?>
<results>
  <result>
    <detailDescription>とても素敵なラジカセ付きカメラ</Detail description>
    <modelNumber>ZE91-CHINPOKO</modelNumber>
    <suggestedPrice>234500</suggestedPrice>
  </result>
  <resultCode>0</resultCode>
</results>

あれ?<result></result>間の項目の並びが ABC 順にソートされてるなあ。
そういう仕様だっけ?まあ、データ上は何の問題も無いが。

2商品を返すなら、

#!/usr/bin/perl

use XML::Simple;

my $val = {
'resultCode' => 0,
'result' => [
{
'modelNumber' => 'ZE91-CHINPOKO',
'suggestedPrice' => 234500,
'detailDescription' => 'とても素敵なラジカセ付きカメラ',
},
{
'modelNumber' => 'ZE94-OMEFERR',
'suggestedPrice' => 1800,
'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

で、出力結果がこうなる。

<?xml version="1.0" encoding="UTF-8" ?>
<results>
  <result>
    <detailDescription>とても素敵なラジカセ付きカメラ</detailDescription>
    <modelNumber>ZE91-CHINPOKO</modelNumber>
    <suggestedPrice>234500</suggestedPrice>
  </result>
  <result>
    <detailDescription>これは一度試してみた方が良い</detailDescription>
    <modelNumber>ZE94-OMEFERR</modelNumber>
    <suggestedPrice>1800</suggestedPrice>
  </result>
  <resultCode>0</resultCode>
</results>

ばっちり。

このアーカイブについて

このページには、2014年10月以降に書かれたブログ記事のうちPerlカテゴリに属しているものが含まれています。

前のアーカイブはPerl: 2014年5月です。

次のアーカイブはPerl: 2014年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら