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)
请始终 use strict在程序的顶部,并my在第一次使用时声明变量.两者use warnings和-w命令行选项都没有意义.第一个是可取的.
<middle method="create">调用元素的twig处理程序时,<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;
}
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)
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |