使用 Perl XML::Twig,如何在每个兄弟节点上循环直到到达最后一个节点?
while (condition_sibling_TWIG, $v)
{
$v=$v->next_sibling;
$v->print;
# process $v
}
条件应该是 ($v != undef) 吗?
谢谢
使用 Perl XML::Twig,如何在每个兄弟节点上循环直到到达最后一个节点?
while (condition_sibling_TWIG, $v)
{
$v=$v->next_sibling;
$v->print;
# process $v
}
条件应该是 ($v != undef) 吗?
谢谢
您可以使用next_siblings
获取兄弟姐妹列表:
foreach my $sibling ($elt->next_siblings)
{ # process sibling
}
next_siblings
接受一个可选条件作为参数,它是一个 XPath 步骤,或者至少是 XML::Twig 支持的 XPath 子集:$elt->next_siblings('p[@type="secret"]'))
更新:
如果没有兄弟姐妹,该sibling
方法返回下一个兄弟姐妹或 undef。您可以使用它来获取下一个,直到没有剩余为止。
兄弟姐妹 ($offset, $optional_condition)
Return the next or previous $offset-th sibling of the element, or the $offset-th one matching $optional_condition. If $offset is
负则返回前一个兄弟,如果 $offset 为正则返回下一个兄弟。$offset=0 如果没有条件或者元素匹配条件>,则返回元素,否则返回 undef。
这是一个例子:
use strict; use warnings;
use XML::Twig;
my $t= XML::Twig->new();
$t->parse(<<__XML__
<root>
<stuff>
<entry1></entry1>
<entry2></entry2>
<entry3></entry3>
<entry4></entry4>
<entry5></entry5>
</stuff>
</root>
__XML__
);
my $root = $t->root;
my $entry = $root->first_child('stuff')->first_child('entry1');
while ($entry = $entry->sibling(1)) {
say $entry->print . ' (' . $entry->path . ')';
}
这只会给你那些你已经拥有的元素之后的元素。如果您从条目 3 开始,您只会得到条目 4 和 5。
原始(编辑)答案:
您还可以使用该siblings
方法遍历元素的所有兄弟元素的列表。
兄弟姐妹($ optional_condition)
Return the list of siblings (optionally matching $optional_condition) of the element (excluding the element itself).
元素按文档顺序排列。
将上面的代码替换为:
my $root = $t->root;
my $entry1 = $root->first_child('stuff')->first_child('entry1');
# This is going to give us entries 2 to 5
foreach my $sibling ($entry1->siblings) {
say $sibling->print . ' (' . $sibling->path . ')';
}
这为您提供了起始元素的所有兄弟姐妹,但不是那个本身。如果从 at 开始,entry3
您将获得条目 1、2、4 和 5。