使用XML :: Twig,我如何检测最后一个兄弟?

时间:2012-06-18 08:17:18

标签: perl siblings xml-twig nextsibling

使用Perl XML :: Twig,如何循环每个兄弟,直到到达最后一个节点?

while (condition_sibling_TWIG, $v)
{
$v=$v->next_sibling;
$v->print;

# process $v 
}

条件应该是($ v!= undef)?

感谢

2 个答案:

答案 0 :(得分:3)

您可以使用next_siblings获取兄弟姐妹列表:

foreach my $sibling ($elt->next_siblings)
  { # process sibling
  }

next_siblings接受一个可选条件作为参数,这是一个XPath步骤,或者至少是XML :: Twig支持的XPath子集:$elt->next_siblings('p[@type="secret"]'))

答案 1 :(得分:2)

<强>更新

如果没有留下兄弟姐妹,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返回元素if   没有条件或元素是否符合条件&gt;,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 . ')';
}

这会为你的所有兄弟姐妹提供你的起始元素,但不是那个本身。如果从entry3开始,您将获得条目1,2,4和5.