2010-08-29 2 views
0

Я пытаюсь использовать модуль XML :: Simple CPAN для преобразования вывода из нашей базы данных в простую структуру XML. Проблема в том, что возвращаемый результат не является тем, на что я надеялся, независимо от того, какие параметры я пытаюсь передать XML :: Simple.Perl Object to 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. Заранее спасибо!

ответ

6

Try:

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>, когда нет ни одной строки данных.

+1

Почти все работает, но код, который вы предоставили, не вставляет каждый элемент под отдельные теги , и вместо этого каждый элемент вложен в свой собственный тег. Я хотел бы, чтобы все элементы были вставлены под один . Любые идеи о том, как обновить предлагаемую реализацию для достижения этой цели? –

+0

Похоже, мы оба заметили это одновременно. Спасибо за обновление и за быстрый ответ. Работает отлично! –

+0

@ Russell: если он работает, пожалуйста, воздержитесь. – Ether

Смежные вопросы