Как я могу превратить мой массив Perl в XML? - PullRequest
1 голос
/ 23 августа 2009

Как мне взять массив Perl, подобный этому

@categories = ( ["Technology", "Gadgets"], ["TV & Film"] );

и сгенерировать этот фрагмент XML?

<itunes:category text="Technology">
    <itunes:category text="Gadgets"/>
</itunes:category>
<itunes:category text="TV &amp; Film"/>

Я могу изменить массив, если есть более простой способ получить тот же вывод.

Ответы [ 4 ]

4 голосов
/ 23 августа 2009

Я на самом деле думаю, что XML :: Simple - один из самых простых XML-модулей для использования в зависимости от того, что вам нужно.

Фрагмент, на который вы ссылаетесь выше, на самом деле не является действительным xml без корневого тега. Вы хотите создать фрагмент или полный действительный документ XML?

XML :: Generator - еще один хороший вариант. Однако ни один из них не сгенерирует фрагмент кода, который у вас есть, поскольку он будет включать корневой тег.

Учитывая вашу мотивацию к вопросу в вашем комментарии ниже, вы можете посмотреть: Mac :: Itunes :: Library :: XML

И как общее заключение: в большинстве случаев при работе с perl search.cpan.org найдет вам то, что вам нужно, и http://cpanratings.perl.org/ покажет, насколько хорошо что-то получено сообществом, если много вариантов.

2 голосов
/ 24 августа 2009

Я не знаю, почему ответ Inshalla был отклонен, потому что XML :: Generator & XML :: Writer являются хорошими модулями для записи XML.

Использование Что в iTunes? spec вы прокомментировали, вот как это может выглядеть при использовании XML :: Generator:

use strict;
use warnings;
use XML::Generator;

my $x = XML::Generator->new( pretty => 2, conformance => 'strict' );

my $itunes_ns = [ 'itunes' => 'http://www.itunes.com/dtds/podcast-1.0.dtd' ];

say $x->xmldecl( encoding => 'UTF-8' );
say $x->rss( 
    $x->channel(
        $x->title('All about Everything'),

        $x->category( $itunes_ns, { text => 'Technology' }, 
            $x->category( $itunes_ns, { text => 'Gadgets' } ),
        ),

        $x->category( $itunes_ns, { text => 'TV & Film' } ),
    ),
);


Это производит:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
  <channel>
    <title>All about Everything</title>
    <itunes:category text="Technology">
      <itunes:category text="Gadgets" />
    </itunes:category>
    <itunes:category text="TV & Film" />
  </channel>
</rss>


Чтобы ответить на «превращение массива Perl в XML», приведем один пример:

use strict;
use warnings;
use XML::Generator;

my $x = XML::Generator->new( pretty => 2, conformance => 'strict' );

my $itunes_ns = [ 'itunes' => 'http://www.itunes.com/dtds/podcast-1.0.dtd' ];

my @categories = ( { "Technology" => [ "Gadgets", 'Gizmo' ] }, "TV & Film" );

say $x->xmldecl( encoding => 'UTF-8' );
say $x->rss( 
    $x->channel(
        $x->title('All about Everything'),

        map { recurse( $_ ) } @categories,
    ),
);

sub recurse {
    my $item = shift;
    return $x->category( $itunes_ns, { text => $item } ) 
        unless ref $item eq 'HASH';

    my ($k, $v) = each %$item;
    return $x->category( $itunes_ns, 
                         { text => $k }, 
                         map { recurse ( $_ ) } @$v );
}


Посмотрите на этот предыдущий вопрос SO , что-то похожее

1 голос
/ 23 августа 2009

Для начала я бы определенно изменил массив. (Нет очевидного соответствия между данными и желаемым фрагментом XML.)

Что-то вроде следующего представления POO?

my $categories = { 
    "Technology" => {
        "Gadgets" => undef
    }, 
    "TV & Film" => undef
};
1 голос
/ 23 августа 2009

Для общего подхода к генерации XML с помощью Perl посмотрите XML :: Generator или XML :: Writer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...