Как получить доступ к значениям в структуре данных, возвращаемых XML :: Simple? - PullRequest
3 голосов
/ 15 декабря 2011

Привет всем,
Это очень просто для программистов на Perl, но не для начинающих, таких как я,
У меня есть один XML-файл, и я обработал с использованием XML :: Simple, как это

my $file="service.xml";
my $xml = new XML::Simple;
 my $data = $xml->XMLin("$file", ForceArray =>  ['Service','SystemReaction',  
                                      'Customers', 'Suppliers','SW','HW'],);

Сбрасывая $data, это выглядит так:

$data = {
   'Service' => [{
         'Suppliers' => [{
               'SW' => [
                  {'Path' => '/work/service.xml',  'Service' => 'b7a'},
                  {'Path' => '/work/service1.xml', 'Service' => 'b7b'},
                  {'Path' => '/work/service2.xml', 'Service' => 'b5'}]}
         ],
         'Id' => 'SKRM',
         'Customers' =>
            [{'SW' => [{'Path' => '/work/service.xml', 'Service' => 'ASOC'}]}],
         'Des'  => 'Control the current through the pipe',
         'Name' => ' Control unit'
      },
      {
         'Suppliers' => [{
               'HW' => [{
                     'Type'    => 'W',
                     'Path'    => '/work/hardware.xml',
                     'Nr'      => '18',
                     'Service' => '1'
                  },
                  {
                     'Type'    => 'B',
                     'Path'    => '/work/hardware.xml',
                     'Nr'      => '7',
                     'Service' => '1'
                  },
                  {
                     'Type'    => 'k',
                     'Path'    => '/work/hardware.xml',
                     'Nr'      => '1',
                     'Service' => '1'
                  }]}
         ],
         'Id' => 'ADTM',
         'Customers' =>
            [{'SW' => [{'Path' => '/work/service.xml', 'Service' => 'SDCR'}]}],
         'Des'  => 'It delivers actual motor speed',
         'Name' => ' Motor Drivers and Diognostics'
      },
      # etc.
   ],
   'Systemreaction' => [
      # etc.
   ],
};

Как получить доступ к каждому элементу сервиса и systemReaction (не предусмотрено). потому что я использую "$ data" в дальнейшей обработке. Поэтому мне нужно получить доступ к каждому идентификатору, клиентам, поставщикам и ценностям в каждой услуге. Как получить конкретное значение из службы, чтобы выполнить какой-то процесс с этим значением. Например, мне нужно получить все значения Id из службы и создать узлы для каждого значения id.

Чтобы получить значение типа и Nr, я пытался так

 foreach my $service (@{ $data->{Service}[1]{Suppliers}[0]{HW}[0] }) {
 say $service->{Nr};
 }
 foreach my $service (@{ $data->{Service}[1]{Suppliers}[0]{HW}[0] }) {
 say $service->{Type};

  }

Можете ли вы помочь мне, как получить все значения Nr и Type от поставщика-> HW.

1 Ответ

8 голосов
/ 15 декабря 2011

Я предлагаю прочитать perldocs Справочное руководство и Ссылки и вложенные структуры данных . Они содержат введение и полное объяснение того, как получить доступ к таким данным.

Но, например, вы можете получить идентификатор услуги, выполнив:

say $data->{Service}[0]{Id}   # prints SKRM

Вы можете просмотреть все службы, напечатав их ID, с циклом:

foreach my $service (@{ $data->{Service} }) {
    say $service->{Id};
}

В ответ на ваше редактирование

$data->{Service}[1]{Suppliers}[0]{HW}[0] является ссылкой на хэш (вы можете быстро проверить это, используя Data::Dumper или Data::Dump или просто ref функция). В частности, это { Nr => 18, Path => "/work/hardware.xml", Service => 1, Type => "W" }

Другими словами, вы почти поняли это - вы просто прошли на один уровень слишком глубоко. Должно быть:

foreach my $service (@{ $data->{Service}[1]{Suppliers}[0]{HW} }) {
 say $service->{Nr};
}

Обратите внимание на отсутствие финального [0], который у вас был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...