2012-06-26 2 views
2

Мне нужно написать скрипт Perl для преобразования XML-файла в файл CSV. Я уже написал что-то простое в одном контексте и должен улучшить его для другого набора данных и не могу понять, что делать.Как получить доступ к данным во вложенной структуре данных из XML :: Simple?

Я пользуюсь XML::Simple.

Вот одна запись данных:

<custom-objects xmlns="http://www.demandware.com/xml/impex/customobject/2006-10-31"> 
    <custom-object type-id="emailBackInStockHistory" object-id="bczCAiaag0APcaaacLsvpJRmzW"> 
     <object-attribute attribute-id="email">[email protected]</object-attribute> 
     <object-attribute attribute-id="emailSentAt">2010-04-10T09:00:01.000+0000</object-attribute> 
     <object-attribute attribute-id="productID">someprodid</object-attribute> 
     <object-attribute attribute-id="requestedAt">2010-04-09T10:07:54.000+0000</object-attribute> 
     <object-attribute attribute-id="siteID">someSITEid</object-attribute> 
    </custom-object> 
</custom-objects> 

Использование Data::Dumper модуля я вижу, что данные обрабатывается как это:

'custom-object' => [ 
    { 
     'type-id'   => 'emailBackInStockHistory', 
     'object-id'  => 'bczCAiaag0APcaaacLsvpJRmzW', 
     'object-attribute' => [ 
      { 
       'attribute-id' => 'email', 
       'content'  => '[email protected]' 
      }, 
      { 
       'attribute-id' => 'emailSentAt', 
       'content'  => '2010-04-10T09:00:01.000+0000' 
      }, 
      { 
       'attribute-id' => 'productID', 
       'content'  => 'someprodid' 
      }, 
      { 
       'attribute-id' => 'requestedAt', 
       'content'  => '2010-04-09T10:07:54.000+0000' 
      }, 
      { 
       'attribute-id' => 'siteID', 
       'content'  => 'someSITEid' 
      } 
     ] 
    }, 

Вот код, который я пытался использовать для выполнения этого экспорта:

foreach $o (@{$data->{'custom-object'}}) { 
    print $o->{'type-id'}, ","; 
    print $o->{'object-id'}, ","; 
    print $o->{'custom-object'}->{'object-attribute'}->{'email'}, ","; 
    print "\n"; 

type-id и object-id получают выход правильно, но я не могу понять, как распечатать данные из ссылки object-attribute.

ответ

1

Вам необходимо перебрать ваш object-attribute массив-ref, как будто вы делаете с массивом-рефлектором custom-object. Также посмотрите на Text::CSV для более надежного способа создания файлов csv.

foreach my $obj (@{ $data->{'custom-object'} }) { 
    print $obj->{'type-id'}, ","; 
    print $obj->{'object-id'}, ","; 
    foreach my $attr (@{ $obj->{'object-attribute'} }) { 
     if ($attr->{'attribute-id'} eq 'email') { 
      print $attr->{'content'}, ","; 
     } 
    } 
    print "\n"; 
} 
+0

Большое спасибо. Я фактически вырезал из исходного кода раздел, в котором я пытался это сделать, несомненно, неправильно. Но этот код не попадает в атрибут объекта. Я пытался бросить небольшую распечатку «x» в среднем цикле, чтобы проверить, не попадал ли код в цикл. Код не распечатывался. –

+0

Это была ошибка в моем soln, теперь исправлена. Также убедитесь, что вы заставляете эти элементы массивами с помощью XML :: Simple, например 'my $ data = XMLin ($ xml, ForceArray => ['custom-object', 'object-attribute']);' – CoffeeMonster