XML::Simple - Как исправить, что одна и та же структура xml приводит к 2 различным структурам данных Perl, в зависимости от количества членов / объединений?

Я новичок в XML::Simple (а также не очень увлекаюсь XML). Я хочу использовать его для анализа простой структуры XML, которую я получаю в результате API. Я не имею никакого влияния на XML, который я получаю.

Когда возвращаемый список xml содержит только один элемент, у меня полностью другая структура данных perl, как тогда, когда в списке больше элементов. Это очень раздражает.

Я хотел бы иметь структуру данных, как в примере 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 за вашу помощь.

Ура, Роберт

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>
    ',
    ForceArray=>['bbb']
);

print Dumper($data1);

Из perldoc XML:: Simple:

ForceArray => 1 # in - важно
Эта опция должна быть установлена ​​в "1", чтобы вложенные элементы были представлены как массивы, даже если есть только один.

Этот параметр особенно полезен, если структура данных, вероятно, будет записана обратно в виде XML, а поведение по умолчанию при объединении отдельных вложенных элементов в атрибуты нежелательно.

Другие вопросы по тегам