Извлечение многоуровневого XML с использованием Perl - PullRequest
1 голос
/ 19 апреля 2011

Я пытаюсь извлечь данные из файла XML.

Формат XML следующий:

<notifications>
<notification name="ccmSmtp" oid="1.3.6.1" status="current">
  <objects>
    <object module="callhome" name="ccmSmtp"/>
  </objects>
  <description>
     This is a description
  </description>
</notification>
<notification name="ccmAlertGroup" oid="1.3.6.1" status="current">
  <objects>
    <object module="callhome" name="callHome"/>
  </objects>
  <description>
       This is a description
  </description>
</notification>
<notification name="ccmAlert" oid="1.3.6.1" status="current">
  <objects>
    <object module="callhome" name="callHome"/>
  </objects>
  <description>
    This is a description
  </description>
</notification>
<notification name="ccmSmtp" oid="1.3.6.1" status="current">
  <objects>
  </objects>
  <description>
      This is a description
  </description>
</notification>
</notifications>

Я написал следующий код для извлечения узла уведомлений из файла example.xml.

#!/usr/bin/perl

use XML::Simple;
use Data::Dumper;

$xml = new XML::Simple;

$data = $xml->XMLin("example.xml",KeyAttr => {
  notifications => notification => 'name'
});

$notification = $data->{notifications};

print Dumper($notification);

Когда я запускаю указанный выше файл Perl, я получаю следующий вывод:

$VAR1 = {
  'notification' => [
      {
        'objects' => {
          'object' => {
            'name' => 'ccmSmtp',
            'module' => 'callhome'
          }
        },
        'status' => 'current',
        'oid' => '1.3.6.',
        'name' => 'ccmSmtp',
        'description' => ' This is a mib '
      },
      {
        'objects' => {
          'object' => {
            'name' => 'callHome',
            'module' => 'module'
          }
        },
        'status' => 'current',
        'oid' => '1.3.6.1.4',
        'name' => 'ccmAlert',
        'description' => 'This is a description'
      },
      {
        'objects' => {
          'object' => {
            'name' => 'callHome',
            'module' => 'homemib'
          }
        },
        'status' => 'current',
        'oid' => '1.3.6.1.4',
        'name' => 'ccmAlertf',
        'description' => 'This is a description'
      },
      {
        'objects' => {},
        'status' => 'current',
        'oid' => '1.3.6.1',
        'name' => 'ccmSmtp',
        'description' => ' This is an example'
      }
    ]
};

Мой вопрос: как мне извлечь содержимое узла уведомлений и сохранить значения в отдельных переменных / массиве?

Ответы [ 4 ]

1 голос
/ 19 апреля 2011

$notification - это просто ссылка на хеш с одним ключевым «уведомлением», содержащим массив хешей.

Вы можете пройти по нему, выполнив

for my $n ( @{$notification->{notification}} ) {
    # ie. to get status out, this is same for description,oid,name
    my $status = $n->{status};

    # To get the nested 'objects' data object module value (phew)
    my $object_module = $n->{status}{object}{module};

}
1 голос
/ 19 апреля 2011

Обычно для извлечения элементов из XML я бы начал с XPath.Существует пакет XPath для Perl, возможно, даже в пакете XML, который вы уже используете.

0 голосов
/ 22 августа 2013

Я бы зациклил, как показано ниже:

foreach $NOTIFICATION( @{$data->{'notification}}) 
{   
foreach $OBJECT (@{$NOTIFICATION->{'OBJECT'}}) 
{
$name=$NOTIFICATION->{'name'};                                 $module=$OBJECT->{'module'}; 

Print $name , $module 
}
}
0 голосов
/ 19 апреля 2011

Мне неясно, чего именно вы хотите.Код, который вы опубликовали, не выдает такой вывод, поскольку он не будет компилироваться, но если вы напишите вместо

my $data = $xml->XMLin("x.xml", KeyAttr => ['notification']);
print Dumper $data;

, вы получите именно это.Теперь $ data -> {Notification} - это ссылка на массив из четырех хешей (соответствующих четырем элементам), к которым можно получить доступ как

my $note0 = $data->{notification}[0];

и т. Д.Это отвечает на ваш вопрос?

...