Я не знаю, почему ответ 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 , что-то похожее