2013-11-08 2 views
0

Я пытался извлечь определенный набор узлов из следующей структуры XML, используя XML :: Twig, но с тех пор застрял. Мне нужно извлечь узлы «игрока» из следующей структуры и выполнить строку match/replace для каждого из этих значений.Извлечение определенных узлов из XML с помощью XML :: Twig

<pep:record> 
    <agency type="player"> 
     <subrecord type="scout"> 
      <isnum>123XXX (print)</isnum> 
      <isnum>234YYY (mag)</isnum> 
     </subrecord> 
     <subrecord type="group"> 
     </subrecord> 
    </agency> 
</record> 

Я пробовал использовать следующий код, но я указываю на ссылку хеша, а не на фактическую строку.

my $parser = XML::Twig->new(twig_handlers => { 
     isnum => sub { print $_->text."::" }, 
    }); 

foreach my $rec (split(/::/, $parser->parse($my_xml))) { 
    if ($rec =~ m/print/) { 
     ($print = $rec) =~ s/(\(print\))//; 
    } 
    elsif($rec =~ m/mag/) { 
     ($mag = $rec) =~ s/(\(mag\))//; 
    } 
} 
+2

Ваш пример XML не является полным. В нем нет ссылки ни на «player», ни на '::'. – simbabque

+0

Упс! Виноват! неверно задана переменная. – pratz

+2

Это не то, что я имел в виду. Я говорил о XML. В конце отсутствует '>', но вы также ссылаетесь на узлы 'player', но таких узлов в вашем XML нет. Нам нужен полный пример. – simbabque

ответ

1

Как я понимаю, что вам нужно что-то вроде этого:

use Modern::Perl; 
use XML::Twig; 

my $my_xml = <<EOL; 
<pep:record> 
    <agency type="player"> 
     <subrecord type="scout"> 
      <isnum>123XXX (print)</isnum> 
      <isnum>234YYY (mag)</isnum> 
     </subrecord> 
     <subrecord type="group"> 
     </subrecord> 
    </agency> 
</pep:record> 
EOL 

my @records; 

my $parser = XML::Twig->new(twig_handlers => { 
     isnum => sub { push @records, $_->text }, 
    }); 

$parser->parse($my_xml); 

foreach my $rec (@records) { 
    if ($rec =~ m/print/) { 
     $rec =~ s/(\(print\))//; 
    } 
    elsif ($rec =~ m/mag/) { 
     $rec =~ s/(\(mag\))//; 
    } 

    say $rec; 
} 
+0

Это решило мою проблему. Большое спасибо :) – pratz

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