2013-03-25 3 views
1

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

Когда возвращаемый список 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 за вашу помощь.

Приветствия, Роберт

ответ

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 # в - важный
Этот параметр должен быть установлен в «1 ', чтобы заставить вложенные элементы быть представлены как массивы, даже если есть только один.

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

+0

Ах, вот и все! Я уже играл с ForceArray, но на «id», а не на один уровень выше! :(;) Теперь мне ясно, как это работает! :) Tnx! Решено! – Enkidu