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

问题描述:

使用Perl XML :: Twig,我如何循环每个兄弟直到到达最后一个节点?使用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支持的XPath子集:: Twig:$elt->next_siblings('p[@type="secret"]'))

+0

谢谢你完美的作品。但如何做,如果我想TWIG继续在下一个元素(SOURCE id =“USA”)寻找next_siblings:'

' – laurentngu

+0

- > next_siblings让我从DEST跳转到DEST。但我无法访问第二个元素(“USA”) – laurentngu

+0

它看起来像需要导航2级结构,SOURCE和嵌套DEST。您可能需要使用嵌套循环,SOURCE元素上的外层循环,DEST子元素中的内层循环。或者在SOURCE上有一个处理程序,并在DEST子项中使用循环(使用'children'方法)。我可能是错的,但在我看来,您使用的心智模式并非正确:您需要将XML作为树浏览,而不是线性数据流。使用'children'和(可能)'parent'而不是'next-sibling' – mirod

更新:

sibling方法,如果没有兄弟姐妹留返回一个同级或*基金。您可以使用它来获取下一个,直到没有剩下的。

兄弟($抵消,$ 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 = 0返回元素,如果 没有条件或元素匹配条件>,否则返回 。

下面是一个例子:

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

+0

我应该使用:foreach my $ sibling($ entry1-> siblings){say $ sibling-> print。 '('。$ sibling-> path。')'; ** OR ** while($ entry = $ entry-> sibling(1)){ 说$ entry-> print。 '('。$ entry-> path。')'; – laurentngu

+0

你可以选择你喜欢的一个,或者甚至使用'next_siblings'而不是'@mirod'提出的'兄弟姐妹'。随你便。但是如果你只想要**之后出现的兄弟姐妹,那么在你的文档中使用'兄弟姐妹'(1)''或'foreach''循环与'next_siblings'走。我相应地改变了答案。 – simbabque