Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XML::Simple将Perl对象转换为XML_Xml_Perl_Xml Simple - Fatal编程技术网

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

使用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

我试图使用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输出。提前谢谢

试试看:

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}之前,我已经修复了它