我正在循環一個樹枝的後代,並且在這個循環中我想創建一個新的樹枝以後輸出這些新的樹枝基本上是當前環狀物品的包裝版本。瞭解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
的根,而不是子樹本身的根。
什麼是正確的方式來採取輸入樹枝後裔,把它變成一個具有包裝結構的樹枝?
(不是我的DV)。我能否提出一些完整的示例XML輸入將有助於大量了解您的代碼目前的功能? – Sobrique
你迫切需要閱讀[*我如何問一個好問題?*](http://stackoverflow.com/questions/how-to-ask) 和[*如何創建一個最小,完整和可驗證的例子*](http://stackoverflow.com/help/mcve)。我記不得任何提供足夠信息的許多問題,甚至無法正確理解您的情況,也不會介意MCVE能夠簡單複製代碼和數據並運行它的理想。 – Borodin
你是否意識到'descendants_or_self'只是返回對象元素及其所有後代?你通過所有這些元素的循環,併爲他們每個人,包裹整個文檔的根節點的'tree'元素,產生像' ... '。我相信那不是你想要的。 –
Borodin