1

私はXML::Simpleを初めて使用します(また、xmlにはあまり熱心ではありません)。APIの結果として取得する単純なxml構造を解析するために使用したいと思います。取得するxmlには何の影響もありません。

返されたxmlリストにメンバーが1つしかない場合、リストにさらにメンバーがある場合とはまったく異なるperlデータ構造になります。これは非常に迷惑です。

結果にメンバーが1つしかない場合でも、例2のようなデータ構造にしたいのですが。

同一の出力を取得するにはどうすればよいですか?

例1:

#!/usr/bin/perl -w

use strict;
use warnings;
use Data::Dumper;
use XML::Simple;

my $xml1  = new XML::Simple;
my $data1 = $xml1->XMLin( '
<aaa>
    <bbb>
        <id>1</id>
        <text>Test 1</text>
    </bbb>
</aaa>
' );

print Dumper($data1);

結果1:

$VAR1 = {
          'bbb' => {
                   'text' => 'Test 1',
                   'id' => '1'
                 }
        };

例2:

my $xml2  = new XML::Simple;
my $data2 = $xml2->XMLin( '
<aaa>
    <bbb>
        <id>1</id>
        <text>Test 1</text>
    </bbb>
    <bbb>
        <id>2</id>
        <text>Test 2</text>
    </bbb>
</aaa>
' );

print Dumper($data2);

結果2:

$VAR1 = {
          'bbb' => {
                   '1' => {
                          'text' => 'Test 1'
                        },
                   '2' => {
                          'text' => 'Test 2'
                        }
                 }
        };

あなたの助けのためのTnx。

乾杯、ロバート

4

1 に答える 1

2

これを試してみてください:

#!/usr/bin/perl -w

use strict;
use warnings;
use Data::Dumper;
use XML::Simple;

my $xml1  = new XML::Simple;
my $data1 = $xml1->XMLin( '
    <aaa>
        <bbb>
            <id>1</id>
            <text>Test 1</text>
        </bbb>
    </aaa>
    ',
    ForceArray=>['bbb']
);

print Dumper($data1);

perldoc XML :: Simpleから:

ForceArray => 1#in --important
このオプションを「1」に設定して、ネストされた要素が1つしかない場合でも配列として表示されるようにする必要があります。

このオプションは、データ構造がXMLとして書き戻される可能性が高く、単一のネストされた要素を属性にロールアップするデフォルトの動作が望ましくない場合に特に役立ちます。

于 2013-03-25T22:28:43.787 に答える