0

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 に指示するにはどうすればよいですか?

4

1 に答える 1

4

1つのオプションはXML::Simple NoAttr

NoAttr => 1 # in+out - 便利

XMLout() で使用すると、生成された XML には属性が含まれません。すべてのハッシュ キー/値は、代わりにネストされた要素として表されます。

XMLin() で使用すると、XML 内の属性はすべて無視されます。

ただし、ドキュメントからXML::Simple

このモジュールのステータス

新しいコードでこのモジュールを使用することはお勧めできません。より直接的で一貫したインターフェースを提供する他のモジュールが利用可能です。特に、XML::LibXML を強くお勧めします。

このモジュールの主な問題は、多数のオプションと、これらのオプションが相互作用する恣意的な方法であり、しばしば予期しない結果をもたらします。

バグ修正とドキュメントの修正を含むパッチは歓迎されますが、新しい機能が追加される可能性は低いです。

したがって、現在直面しているまさにその問題のために、XML::LibXMLまたはのいずれかを使用することを強くお勧めします。XML::Twig

私たちを信じなさい。この解決策が機能したとしても、これはおそらく最初の解決策です。

于 2014-10-01T15:59:13.090 に答える