1

Perl XML :: Twigを使用して、最後のノードに到達するまで各兄弟をループするにはどうすればよいですか?

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

# process $v 
}

条件は($ v!= undef)である必要がありますか?

ありがとう

4

2 に答える 2

3

next_siblings兄弟のリストを取得するために使用できます。

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

next_siblingsオプションの条件を引数として受け入れます。これはXPathステップ、または少なくともXML::TwigでサポートされているXPathのサブセットです。$elt->next_siblings('p[@type="secret"]'))

于 2012-06-18T09:37:21.573 に答える
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は、条件がない場合、または要素が条件>に一致する場合は要素を返し、それ以外の場合は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が表示されます。

于 2012-06-18T08:47:14.170 に答える