我正在尝试使用XML :: Simple构建看起来像这样的XML:
<response>
<device>
<interface>
<mh>0x123abc</mh>
<portname>Gi1/1</portname>
</interface>
<interface>
<mh>0x123abc</mh>
<portname>Gi1/1</portname>
</interface>
<interface>
<mh>0x123abc</mh>
<portname>Gi1/1</portname>
</interface>
</device>
</response>
我发现XML :: Simple很难像我想的那样表现,所以我尝试用自己的药来喂它:
$req = <<EOF;
<response>
<device>
<interface>
<mh>0x123abc</mh>
<portname>Gi1/1</portname>
</interface>
<interface>
<mh>0x123abc</mh>
<portname>Gi1/1</portname>
</interface>
<interface>
<mh>0x123abc</mh>
<portname>Gi1/1</portname>
</interface>
</device>
</response>
EOF
print Dumper(XML::Simple::XMLin($req));
的产率:
$VAR1 = {
'device' => {
'interface' => [
{
'portname' => 'Gi1/1',
'mh' => '0x123abc'
},
{
'portname' => 'Gi1/1',
'mh' => '0x123abc'
},
{
'mh' => '0x123abc',
'portname' => 'Gi1/1'
}
]
}
};
如果我将其反馈回XML :: Simple并打印出来:
my $xml = XML::Simple::XMLout($VAR1, RootName => "response");
print $xml;
我得到了这个,这与我首先发送的内容不符:
<response>
<device>
<interface mh="0x123abc" portname="Gi1/1" />
<interface mh="0x123abc" portname="Gi1/1" />
<interface mh="0x123abc" portname="Gi1/1" />
</device>
</response>
如何告诉XML :: Simple将节点视为节点而不是属性?
答案 0 :(得分:4)
一个选项是XML::Simple NoAttr
NoAttr =&gt; 1#in + out - 得心应手
与XMLout()一起使用时,生成的XML将不包含任何属性。所有散列键/值都将表示为嵌套元素。
当与XMLin()一起使用时,XML中的任何属性都将被忽略。
但是,请参阅XML::Simple
本模块的状态
不鼓励在新代码中使用此模块 。其他模块可用,提供更直接和一致的接口。特别强烈建议使用XML :: LibXML。
此模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果。
欢迎使用包含错误修复和文档修补程序的修补程序,但不太可能添加新功能。
因此,我强烈建议您使用XML::LibXML
或XML::Twig
因为您现在面临的问题。
相信我们。这可能是许多人中的第一个,即使这个解决方案确实有效。