Montando XML em Perl

Estou precisando fazer chamadas de API para um arquivador da NetApp. Eu sei que XML bruto eu preciso enviar:

<? xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE netapp SYSTEM "file:/etc/netapp_filer.dtd">
<netapp version="1.7" vfiler="somevfiler" xmlns="http://www.netapp.com/filer/admin">
    <nfs-exportfs-list-rules>
        <pathname>/vol/path/to/somewhere</pathname>
    </nfs-exportfs-list-rules>
</netapp>

Tendo começado a montar como 'texto simples', tenho tentado 'fazer melhor' comXML::Twig.

Mas estou tendo dificuldade em inserir as duas primeiras linhas, pois elas não fazem parte da árvore XML.

Eu caveiXML::Twig::Elt e descobri que eu provavelmente precisoset_pi para obter a primeira linha, mas ... bem, estou tendo alguma dificuldade com a saída desejada.

Até agora eu tenho:

use strict;
use warnings;

use XML::Twig;

my $content = XML::Twig::Elt->new(
    'netapp',
    {   version => 1.7,
        vfiler  => "somevfiler",
        xmlns   => "http://www.netapp.com/filer/admin",
    },
);
$content->insert_new_elt('nfs-exportfs-list-rules')
    ->insert_new_elt( 'pathname', '/vol/path/to/somewhere' );

$content->set_pretty_print('indented');
$content->print;

e separadamente:

my $header = XML::Twig::Elt -> new () -> set_pi('xml', 'version="1.0" encoding="utf-8"');
$header -> print;

Para o DOCTYPE, tenho:

my $twig = XML::Twig -> new ();
$twig -> set_root($content);
$twig -> set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"');

$twig -> print;

Mas o que não consigo descobrir é como 'mesclar' o cabeçalho nele. Se eu fizer um simples:

$twig -> root -> set_pi('xml', 'version="1.0" encoding="utf-8"');

Isso derruba o conteúdo. O que estou perdendo aqui? Existe uma maneira melhor de inserir essa inicialxml linha?

Encontrei:como ler e alterar a tag <! Doctype> e <? xml version = "1.0"?> no xml twig?

Mas isso não funciona muito bem, porque eu preciso dessa linha - antes do meu doctype.

Por exemplo.:

my $twig = XML::Twig -> new ( 'pretty_print' => 'indented' );
$twig -> set_root($content);
$header -> move ( before => $twig -> root );
$twig -> set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"');

$twig -> print;

Produz:

 <!DOCTYPE netapp SYSTEM "file:/etc/netapp_filer.dtd">

  <?xml version="1.0" encoding="utf-8"?><netapp version="1.7" vfiler="somevfiler" xmlns="http://www.netapp.com/filer/admin">
  <nfs-exportfs-list-rules>
    <pathname>/vol/path/to/somewhere</pathname>
  </nfs-exportfs-list-rules>
</netapp>

Que fica perto, mas não chega lá ...

questionAnswers(1)

yourAnswerToTheQuestion