如何访问XML :: Simple返回的数据结构中的值?

时间:2011-12-15 17:23:37

标签: perl data-structures reference

大家好,
这对于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值并为每个id值创建节点。

要获得Type和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};

  }

您可以帮我了解如何从Supplier-> HW获得所有Nr和Type值。

1 个答案:

答案 0 :(得分:8)

我建议您阅读perldocs Reference TutorialReferences and Nested Data Structures。它们包含有关如何访问这类数据的介绍和完整说明。

但是,例如,您可以通过执行以下操作来访问服务ID:

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

你可以通过循环遍历所有服务,打印他们的ID:

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

响应您的编辑

$data->{Service}[1]{Suppliers}[0]{HW}[0]是一个哈希引用(您可以使用Data::DumperData::Dumpref函数快速查看。特别是{ Nr => 18, Path => "/work/hardware.xml", Service => 1, Type => "W" }

换句话说,你几乎得到了它 - 你只是过了一层。它应该是:

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

请注意缺少最终的[0]