1

我还是新手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

input.xwo 示例:

<top id="World">

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

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

</top>

我的简单代码:

#!/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";
}
4

1 回答 1

7

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

<middle method="create">调用元素的树枝处理程序时,您需要的兄弟姐妹<middle method="modify">尚未处理。找不到它,因为它还没有在XML::Twig解析树中。

您必须读取整个 XML 结构并在之后对其进行处理,或者为包含create和元素的元素编写一个处理程序modify

该程序执行后者。

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;
}

更新

此替代方法读取整个 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;
}
于 2012-07-30T17:05:10.067 回答