1

XML :: Simple CPANモジュールを使用して、データベースからの出力を単純なXML構造に変換しようとしています。問題は、XML :: Simpleにどのオプションを渡そうとしても、返される出力が私が望んでいたものではないことです。

出力しようとしているデータベーステーブルは、次の定義を持つ一連のアイテムです。

CREATE TABLE `items` (
  `id` int(8) NOT NULL,
  `name` varchar(40) NOT NULL,
  `manufacturer` varchar(40) NOT NULL,
  `added` datetime NOT NULL,
  PRIMARY KEY  (`id`)
);

現在使用しているPerlコードは次のとおりです。

my $SQL = qq| select * from items |;
my $sth = main::DatabaseQuery($SQL);

my $items;
my $count = 0;
while(my $item = $sth->fetchrow_hashref()) {
    $items->[$count] = $item;
    $count++;
}

require XML::Simple;
my $xs = XML::Simple->new(ForceArray => 1, KeepRoot => 1);
my $xml = $xs->XMLout($ref);

これにより、次のXMLが出力されます。

<anon id="10000" name="Item 1" manufacturer="Manufacturer 1" added="2009-01-01" /> 
<anon id="10001" name="Item 2" manufacturer="Manufacturer 2" added="2009-01-01" /> 
<anon id="10002" name="Item 3" manufacturer="Manufacturer 3" added="2009-01-01" /> 

代わりに、次のように出力したいと思います。

<items>
    <item>
        <id>10000</id> 
        <name>Item 1</name> 
        <manufacturer>Manufacturer 1</manufacturer> 
        <added>2009-01-01</added> 
    </item>
    <item>
        <id>10001</id> 
        <name>Item 2</name> 
        <manufacturer>Manufacturer 2</manufacturer> 
        <added>2009-01-01</added> 
    </item>
    <item>
        <id>10002</id> 
        <name>Item 3</name> 
        <manufacturer>Manufacturer 3</manufacturer> 
        <added>2009-01-01</added> 
    </item>
</items>

私が見落としている小さなことがいくつかあると確信しているので、現在の実装を変更して目的のXML出力を生成する方法を教えてください。前もって感謝します!

4

1 に答える 1

7

試す:

my $SQL = qq| select * from items |;
my $sth = main::DatabaseQuery($SQL);

my $items = [];
while(my $item = $sth->fetchrow_hashref()) {
    push @$items, $item;
}

use XML::Simple;
my $xs = XML::Simple->new(ForceArray => 1, KeepRoot => 1, NoAttr => 1);
my $xml = $xs->XMLout( { items => { item => $items } } );

最後の配列インデックスをカウントして割り当てる代わりにプッシュを使用するように変更し、アイテムを初期化し<item></item>て、データ行がないときに取得しないように変更したことに注意してください。

于 2010-08-29T19:39:02.433 に答える