Ensamblar XML en Perl
Necesito hacer llamadas API a un archivador de NetApp. Sé qué XML sin formato debo 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>
Después de comenzar a ensamblar como 'texto plano', he estado tratando de 'hacerlo mejor' conXML::Twig
.
Pero tengo dificultades para insertar las dos primeras líneas, ya que no son 'parte' del árbol XML.
He desenterradoXML::Twig::Elt
y descubrí que probablemente necesitoset_pi
para obtener la primera línea, pero ... bueno, estoy teniendo algunas dificultades con la salida deseada.
Hasta ahora tengo:
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;
y por separado:
my $header = XML::Twig::Elt -> new () -> set_pi('xml', 'version="1.0" encoding="utf-8"');
$header -> print;
Para el DOCTYPE tengo:
my $twig = XML::Twig -> new ();
$twig -> set_root($content);
$twig -> set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"');
$twig -> print;
Pero lo que no puedo entender es cómo 'fusionar' el encabezado en él. Si hago un simple:
$twig -> root -> set_pi('xml', 'version="1.0" encoding="utf-8"');
Cambia el contenido. ¿Que me estoy perdiendo aqui? ¿Hay una mejor manera de insertar esa inicialxml
¿línea?
He encontrado:¿Cómo leer y cambiar la etiqueta <! Doctype> y <? xml version = "1.0"?> en xml twig?
Pero eso no funciona del todo, porque necesito esa línea, antes de mi doctype.
P.ej.:
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;
Produce:
<!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 está cerca, pero no del todo ...