无法使用XML :: Twig将方法next_sibling或next_elt与twig_handlers一起使用

lau*_*ngu 1 perl xml-twig xml-parsing

我还是新用的XML::Twig.

从主程序中我寻找具有属性的元素 @method="create"

在子例程中player,我想找到具有属性的下一个元素/兄弟@method="modify".

这两种方法都在子程序player中因错误而失败Can't call method "gi" on an undefined value

my $modif1=$valeur->next_sibling('[@method="modify"]')

my $modif2=$valeur->next_elt('[@method="modify"]')->parent
Run Code Online (Sandbox Code Playgroud)

input.xwo示例:

<top id="World">

  <middle id="France" method="create">
  </middle>

  <middle id="Germany" method="modify">
  </middle>

</top>
Run Code Online (Sandbox Code Playgroud)

我的简单代码:

#!/bin/perl -w
use warnings;
use XML::Twig;

my $twig= new XML::Twig( 
  twig_handlers => {
    '[@method="create"]' => \&player
  } 
);                    

$twig->parsefile("input.xwo");
$twig->purge;  

sub player { 

  my ($twig, $valeur) = @_;                     

  my $modif1 = $valeur->next_sibling('[@method="modify"]');
  my $modif2 = $valeur->next_elt('[@method="modify"]')->parent;
  print "\nnextELT=" . $modif->gi . "\n";
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 7

始终 use strict在程序的顶部,并my在第一次使用时声明变量.两者use warnings-w命令行选项都没有意义.第一个是可取的.

<middle method="create">调用元素的twig处理程序时,<middle method="modify">尚未处理所需的兄弟节点.它找不到,因为它还没有在XML::Twig解析树中.

您必须读取整个XML结构和事后处理它,或写包围元素的处理createmodify元素.

这个程序执行后者.

use strict;
use warnings;

use XML::Twig;

my $twig= XML::Twig->new(
  twig_handlers => {
    top => \&player
  } 
);                    

$twig->parsefile('input.xwo');
$twig->purge;  

sub player { 

  my ($twig, $valeur) = @_;                   

  my $create = $valeur->first_child('[@method="create"]');
  return unless $create;

  my $modify = $create->next_sibling('[@method="modify"]');
  return unless $modify;

  printf "\nnextELT = %s\n", $modify->gi;

  $twig->purge;
}
Run Code Online (Sandbox Code Playgroud)

更新

此替代方法读取整个XML树,然后从中提取数据.它开始通过寻找所有在树中有一个元素method等于属性'create',然后发现他们每个人以下的兄弟用method的属性'modify'.

use strict;
use warnings;

use XML::Twig;

my $twig= XML::Twig->new;

$twig->parsefile('input.xwo');

my @creates = $twig->get_xpath('//*[@method="create"]');

foreach my $create (@creates) {
  my $modify = $create->next_sibling('[@method="modify"]');
  next unless $modify;
  printf "\nnextELT = %s\n", $modify->gi;
}
Run Code Online (Sandbox Code Playgroud)