使用Perl XML :: Twig,我如何循環每個兄弟直到到達最後一個節點?使用XML :: Twig,我如何檢測最後一個兄弟?
while (condition_sibling_TWIG, $v)
{
$v=$v->next_sibling;
$v->print;
# process $v
}
條件是($ v!= undef)?
感謝
使用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"]'))
更新:
的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
我應該使用:foreach my $ sibling($ entry1-> siblings){say $ sibling-> print。 '('。$ sibling-> path。')'; ** OR ** while($ entry = $ entry-> sibling(1)){ 說$ entry-> print。 '('。$ entry-> path。')'; – laurentngu
你可以選擇你喜歡的一個,或者甚至使用'next_siblings'而不是'@mirod'提出的'兄弟姐妹'。隨你便。但是如果你只想要**之後出現的兄弟姐妹,那麼在你的文檔中使用'兄弟姐妹'(1)''或'foreach''循環與'next_siblings'走。我相應地改變了答案。 – simbabque
謝謝你完美的作品。但如何做,如果我想TWIG繼續在下一個元素(SOURCE id =「USA」)尋找next_siblings:' <源ID = 「USA」> ' –
laurentngu
- > next_siblings讓我從DEST跳轉到DEST。但我無法訪問第二個元素(「USA」) – laurentngu
它看起來像需要導航2級結構,SOURCE和嵌套DEST。您可能需要使用嵌套循環,SOURCE元素上的外層循環,DEST子元素中的內層循環。或者在SOURCE上有一個處理程序,並在DEST子項中使用循環(使用'children'方法)。我可能是錯的,但在我看來,您使用的心智模式並非正確:您需要將XML作爲樹瀏覽,而不是線性數據流。使用'children'和(可能)'parent'而不是'next-sibling' – mirod