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 構造全体を読み取って後で処理するか、 要素と要素の両方を囲む要素のハンドラーを作成する必要があります。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;
}

アップデート

この代替手段は、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 に答える