電子書籍の厳選無料作品が豊富!

perlを使って、下記のXMLファイルを出力したいです。

<?xml version='1.0' encoding='UTF-8' ?>
<member>
<No>00001</No>
<Product>
<ProductSeqNo>0</ProductSeqNo>
<ProductName>スマートフォン</ProductName>
</Product>
<Product>
<ProductSeqNo>3</ProductSeqNo>
<ProductName>モニタ</ProductName>
</Product>
<RegistDate>2012/11/29</RegistDate>
</member>

<Product>タグの部分は、編集情報を設定するため、下記のようにプログラミングしています。

my $p = {
member => [
{
No => "$id",
Product => {},
RegistDate => "$RegistDate"
}
]
};

my $AddData = {
Product =>
{
ProductSeqNo => ["$seqno"],
ProductName => ["ProductName"]
}
};
push(@{$p->{member}}, $AddData); # データを追加

my $x = new XML::Simple;
my $xml = $x->XMLout($p, NoAttr=>1, KeepRoot=>1, OutputFile => "$dir/$Details", XMLDecl => "<?xml version='1.0' encoding='UTF-8' ?>");

上記を動かすと、以下のように出力されます。
<?xml version='1.0' encoding='UTF-8' ?>
<member>
<No>00001</No>
<Product></Product>
</member>
<member>
<Product>
<ProductName>ProductName2</ProductName>
<ProductSeqNo>1</ProductSeqNo>
</Product>
</member>

最初のイメージで出力する方法をご存知の方は教えて下さい。

A 回答 (1件)

> push(@{$p->{member}}, $AddData); # データを追加



XML::Simple についてはわかりませんが、上記の push 文を実行後の $p のデータ構造は次のようになります。

$p = {
member => [
{
No => "$id",
Product => {},
RegistDate => "$RegistDate"
},
{
Product =>
{
ProductSeqNo => ["$seqno"],
ProductName => ["ProductName"]
}
}
]
};

必要なのは member が指す配列に要素を追加することではなく、Product が指す値の中にデータを追加する事だと思います。そのためには Product => {} を Product => [] に変更して、その無名配列の中に ProductSeqNo と ProductName を格納したハッシュを追加してはどうでしょうか。

Product => [],
...
push @{$p->{member}->[0]->{Product}}, $AddData->{Product};
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!