Сборка XML в Perl
Мне нужно сделать вызовы API для файлера NetApp. Я знаю, какой сырой XML мне нужно отправить:
<? 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>
Начав собираться как "простой текст", я пытался "сделать это лучше" с XML::Twig
,
Но у меня возникают трудности с вставкой первых двух строк, поскольку они не являются "частью" дерева XML.
Я выкопал XML::Twig::Elt
и понял, мне, вероятно, нужно set_pi
чтобы получить первую строку, но... ну, у меня возникли некоторые трудности с желаемым выводом.
Пока что у меня есть:
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;
и отдельно:
my $header = XML::Twig::Elt -> new () -> set_pi('xml', 'version="1.0" encoding="utf-8"');
$header -> print;
Для DOCTYPE у меня есть:
my $twig = XML::Twig -> new ();
$twig -> set_root($content);
$twig -> set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"');
$twig -> print;
Но я не могу понять, как "слить" заголовок в него. Если я сделаю простой:
$twig -> root -> set_pi('xml', 'version="1.0" encoding="utf-8"');
Это забивает контент. Что мне здесь не хватает? Есть ли лучший способ вставить этот начальный xml
линия?
Я нашел: как читать и изменять тег и Xml version = "1.0"?> В ветке xml?
Но это не совсем работает, потому что мне нужна эта строка - до моего доктрипа.
Например:
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;
Производит:
<!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>
Что близко, но не совсем там...
1 ответ
Я нашел это с небольшим копанием - set_pi
была красная сельдь. Что я действительно хочу это:
XML::Twig
методы: set_xml_version
, set_encoding
, а также set_doctype
,
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->set_root(
XML::Twig::Elt->new(
'netapp',
{ version => 1.7,
vfiler => "somevfiler",
xmlns => "http://www.netapp.com/filer/admin",
},
)
);
my $api_req = $twig->root->insert_new_elt('nfs-exportfs-list-rules');
$api_req ->insert_new_elt( 'pathname', '/vol/path/to/somewhere' );
$api_req -> insert_new_elt ('your mum' );
# etc.
$twig->set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"');
$twig->set_xml_version("1.0");
$twig->set_encoding('utf-8');
$twig->print;
Примечание. Для отправки через LWP вам потребуется $request -> content ( $twig -> sprint )
;