2013-09-24 8 views
1

Я довольно новичок в написании сценариев на Perl. Мне нужна помощь, чтобы получить значение атрибута XML total-alarms (в этом случае 11).получить значение атрибута xml с помощью perl

<?xml version="1.0" encoding="utf-8"?> 
<alarm-response-list xmlns="url.com" throttle="11" total-alarms="11"> 
    <alarm-responses> 
    <alarm id="51ebf6fc-0571-1001-0162-008014000af00" /> 
    <alarm id="51ec0320-07af-1001-0162-008010400af00" /> 
    <alarm id="51ebf6f4-0564-1001-0162-008014000af00" /> 
    <alarm id="51ec1512-0bb2-1001-0162-008010400af00" /> 
    <alarm id="51ec157d-0bed-1001-0162-008010040af00" /> 
    <alarm id="51ebae1b-fa31-1000-0162-008010004af00" /> 
    <alarm id="51ec06d4-08bf-1001-0162-00801000a4f00" /> 
    <alarm id="51e8303f-740a-1000-0162-008014000af00" /> 
    <alarm id="51ebeabc-0352-1001-0162-008010400af00" /> 
    <alarm id="51ebf74d-0593-1001-0162-008010040af00" /> 
    <alarm id="51ebf78d-05b3-1001-0162-008010004af00" /> 
    </alarm-responses> 
</alarm-response-list> 

Безуспешно, я пытался использовать следующий Perl код:

my $parser4 = XML::LibXML->new(); 
my $doc4 = $parser4->parse_file($current_working_dir.'\POSTres.xml'); 
my $xc = XML::LibXML::XPathContext->new($doc4->documentElement() ); 
my $nod = $xc->findnodes('//alarm-response-list'); 
print "A: ".$nod->getAttributes("total-alarms")."\n"; 

Любую идею?

ответ

4

Вот способ использования XML::Twig модуля:

#!/usr/bin/env perl 

use warnings; 
use strict; 
use XML::Twig; 

my $twig = XML::Twig->new(
    twig_roots => { 
     '/alarm-response-list' => sub { printf qq|%s\n|, $_->att('total-alarms') }, 
    }, 
)->parsefile(shift); 

Выполнить это нравится:

perl script.pl xmlfile 

Это дает:

11 
+0

Как сохранить значение в переменной за пределами анонимной подпрограммы? а не просто печатать на экране. – shloro

+3

объявить переменную перед синтаксическим разбором и назначить ей в обработчике. Магия закрытий заставит его работать. – mirod

3

Ваше выражение XPath не соответствует, потому что вы указали пространство имен в документе XML:

<alarm-response-list xmlns="url.com" ... 

Если мы фиксируем, что пространство имен в контексте XPath, то мы можем извлечь данные с помощью XPath:

  1. Регистрация пространства имен. Например.

    $xc->registerNs('a' => "url.com"); 
    
  2. Используйте это пространство имен в XPath, например.

    my ($alarms) = $xc->findvalue('//a:alarm-response-list/@total-alarms'); 
    

Теперь это извлекает значение атрибута, как и ожидалось.

Смежные вопросы