如何指定XML :: Simple数据点是节点而不是属性?

时间:2014-10-01 15:54:41

标签: perl xml-serialization xml-simple

我正在尝试使用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将节点视为节点而不是属性?

1 个答案:

答案 0 :(得分:4)

一个选项是XML::Simple NoAttr

  

NoAttr =&gt; 1#in + out - 得心应手

     

与XMLout()一起使用时,生成的XML将不包含任何属性。所有散列键/值都将表示为嵌套元素。

     

当与XMLin()一起使用时,XML中的任何属性都将被忽略。

但是,请参阅XML::Simple

的文档
  

本模块的状态

     

不鼓励在新代码中使用此模块 。其他模块可用,提供更直接和一致的接口。特别强烈建议使用XML :: LibXML。

     

此模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果。

     

欢迎使用包含错误修复和文档修补程序的修补程序,但不太可能添加新功能。

因此,我强烈建议您使用XML::LibXMLXML::Twig因为您现在面临的问题。

相信我们。这可能是许多人中的第一个,即使这个解决方案确实有效。