使用XML :: Simple将Perl对象转换为XML

Rus*_* C. 0 xml perl xml-simple

我正在尝试使用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`)
);
Run Code Online (Sandbox Code Playgroud)

这是我们目前使用的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);
Run Code Online (Sandbox Code Playgroud)

这将输出以下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" /> 
Run Code Online (Sandbox Code Playgroud)

我反而希望它输出如下:

<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>
Run Code Online (Sandbox Code Playgroud)

我确定有一些我忽略的小事情,所以请让我知道如何改变我们当前的实现以产生我们想要的XML输出.提前致谢!

yst*_*sth 6

尝试:

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 } } );
Run Code Online (Sandbox Code Playgroud)

请注意,我将其更改为使用push而不是计数并分配给最后一个数组索引以及初始化项目,以便<item></item>在没有数据行时无法获取.