在 Perl 中汇编 XML
Assembling XML in 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>
从 'plain text' 开始组装后,我一直在尝试 'do it better' 和 XML::Twig
。
但是我很难插入前两行,因为它们不是 XML 树的 'part'。
我已经找到 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;
但我想不通的是如何将 'merge' 和 header 放入其中。如果我做一个简单的:
$twig -> root -> set_pi('xml', 'version="1.0" encoding="utf-8"');
它破坏了内容。我在这里错过了什么?有没有更好的方法来插入初始 xml
行?
我发现:how to read and change <!Doctype> tag and <?xml version="1.0"?> in xml twig?
但这不太奏效,因为我需要那行 - 在我的文档类型之前。
例如:
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>
接近,但不完全...
我通过一些挖掘发现了它 - 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 )
;
我需要 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>
从 'plain text' 开始组装后,我一直在尝试 'do it better' 和 XML::Twig
。
但是我很难插入前两行,因为它们不是 XML 树的 'part'。
我已经找到 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;
但我想不通的是如何将 'merge' 和 header 放入其中。如果我做一个简单的:
$twig -> root -> set_pi('xml', 'version="1.0" encoding="utf-8"');
它破坏了内容。我在这里错过了什么?有没有更好的方法来插入初始 xml
行?
我发现:how to read and change <!Doctype> tag and <?xml version="1.0"?> in xml twig?
但这不太奏效,因为我需要那行 - 在我的文档类型之前。
例如:
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>
接近,但不完全...
我通过一些挖掘发现了它 - 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 )
;