私は小枝の子孫をループしています。このループでは、後で出力する新しい小枝を作成したいと考えています。XML :: Twigの理解wrap_in
# $twig already exists.
my @descendants = $twig->root->first_child->descendants_or_self;
foreach (@descendants) {
$_->root->wrap_in('tree');
my $treetop = XML::Twig->new()->set_root($_);
$treetop->root->wrap_in('trees', treebank => {
id => 'someid'
});
if (exists $hash{'somekey'}) {
$treetop->root->set_att(c => 'd');
}
}
ループ内$_->sprint
の例:
<node begin="0">
<node a="b"></node>
</node>
しかし、この結果(IF-句最後後)である($treetop->sprint
):
<node begin="0" c="d">
<node a="b"></node>
</node>
つまり、属性は最初の「ルート」に追加され、折り返しは発生しません。しかし、私が達成しようとしていることである:
<treebank id="someid" c="d">
<trees>
<tree>
<node begin="0">
<node a="b"></node>
</node>
</tree>
</trees>
</treebank>
興味深いことに、私は$_->root
を呼び出すときに、私は元のルート($twig
のルート)を見ることが、私は根が暗黙的にオブジェクトの一部として継承されていると思います。私はそれが私の混乱の大部分があると思う:$_
のroot
は実際には$twig
のルートであり、サブツリー自体のルートではない。
入力枝の子孫を取る正しい方法は、それを折り返し構造の小枝に変えますか?
、
XML::Twig
のcut
とpaste
メソッドを使用してこれを分離することができます(ない私のDV)。あなたのコードが現在何をしているかを理解するのに大いに役立ついくつかの完全なXML入力例を提案できますか? – Sobriqueと[*最小限で完全で検証可能なサンプルを作成するにはどうすればいいですか? *](http://stackoverflow.com/help/mcve)。私はあなたの状況を正しく理解するためにも十分な情報の近くにあなたの多くの質問のどれもを覚えていません。あなたのコードとデータを単純にコピーして実行できるという理想は絶対に思いません。 – Borodin
'descendants_or_self'は単にオブジェクト要素とそのすべての子孫を返しますか?あなたは ' ... 'のようなものを生産、 'tree'要素で文書全体のルートノードを包む、それらのそれぞれのために、これらの要素のすべてをループしています。私はそれがあなたの意図ではないと確信しています。 –
Borodin