使用XML::Simple将Perl对象转换为XML
我试图使用XML::Simple CPAN模块将数据库的输出转换为简单的XML结构。问题是,无论我试图将什么选项传递给XML::Simple,返回的输出都不是我所希望的 我们试图输出的数据库表只是一组具有以下定义的项:使用XML::Simple将Perl对象转换为XML,xml,perl,xml-simple,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
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输出。提前谢谢 试试看:
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 } } );
请注意,我将其更改为使用push,而不是对最后一个数组索引进行计数和赋值,还初始化了项,这样在没有数据行时就不会得到这些项。请尝试:
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 } } );
请注意,我将其改为使用push,而不是对最后一个数组索引进行计数和赋值,也初始化了项,这样在没有数据行时就不会得到这些项。几乎可以工作,但您提供的代码没有将每个项嵌套在单独的标记下,而是将每个项嵌套在自己的标记中。我想所有项目都嵌套在一个单一的。如何更新建议的实现以实现这一点,您有什么想法吗?看起来我们都同时注意到了这一点。感谢您的更新和快速响应。很好用@Russel C:谢谢,在您评论之前我已经修复了它,它的XMLout{items=>$items}几乎可以工作,但是您提供的代码并没有将每个项嵌套在单独的标记下,而是将每个项嵌套在它自己的标记中。我想所有项目都嵌套在一个单一的。如何更新建议的实现以实现这一点,您有什么想法吗?看起来我们都同时注意到了这一点。感谢您的更新和快速响应。很好用@拉塞尔C:谢谢,在你评论它有XMLout{items=>$items}之前,我已经修复了它