【问题标题】:Perl Object to XML Using XML::SimplePerl 对象到 XML 使用 XML::Simple
【发布时间】:2023-03-31 18:16:01
【问题描述】:

我正在尝试使用 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 输出。提前致谢!

【问题讨论】:

    标签: xml perl xml-simple


    【解决方案1】:

    试试:

    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 而不是计数并分配给最后一个数组索引以及初始化项目,因此当没有数据行时您不会得到 &lt;item&gt;&lt;/item&gt;

    【讨论】:

    • 几乎可以工作,但是您提供的代码不会将每个项目嵌套在单独的 标记下,而是每个项目都嵌套在它自己的 标记中。我希望所有项目都嵌套在一个 下。有什么想法可以更新您建议的实现以实现此目的吗?
    • 看起来我们俩同时注意到了这一点。感谢您的更新和快速响应。完美运行!
    • @Russel C.:谢谢,在你评论之前我已经修好了(它有 XMLout( { items =&gt; $items } )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多