我试图简单地添加一个 xml 代码块(来自 parsed_balance_chunk),测试尝试添加一个孩子和作为兄弟姐妹的效果。我正在玩“insertAfter”和“addSibling”并测试如何在xml的不同部分插入片段。使用“insertAfter”(以及“insertBefore”),它将它添加为“C”的最后一个孩子。1.)我怎样才能让它作为“C”的第一个孩子插入(即在“D”之前)?2.)通过另一个测试,我怎样才能让它成为“C”的兄弟?当我尝试“addSibling”时,它会返回一条消息,说“添加尚不支持 addSibling 的文档片段!”。
此外,对于 $frag 的定义,如果我在 foreach 外观之外定义它,它只会将 $frag 添加到第一个节点(而不是“C”的第二次出现)。
代码:
use warnings;
use strict;
use XML::LibXML;
use Data::Dumper;
my $parser = XML::LibXML->new({keep_blanks=>(0)});
my $dom = $parser->load_xml(location => 'test_in.xml') or die;
my @nodes = $dom->findnodes('//E/../..');
foreach my $node (@nodes)
{
my $frag = $parser->parse_balanced_chunk ("<YY>yyy</YY><ZZ>zz</ZZ>");
$node->insertBefore($frag, undef);
#$node->addSibling($frag);
}
open my $FH, '>', 'test_out.xml';
print {$FH} $dom->toString(1);
close ($FH);
输入文件:
<?xml version="1.0"?>
<TT>
<A>ZAB</A>
<B>ZBW</B>
<C>
<D>
<E>ZSE</E>
<F>ZLC</F>
</D>
</C>
<C>
<D>
<E>one</E>
</D>
</C>
</TT>
输出文件:
<?xml version="1.0"?>
<TT>
<A>ZAB</A>
<B>ZBW</B>
<C>
<D>
<E>ZSE</E>
<F>ZLC</F>
</D>
<YY>yyy</YY>
<ZZ>zz</ZZ>
</C>
<C>
<D>
<E>one</E>
</D>
<YY>yyy</YY>
<ZZ>zz</ZZ>
</C>
</TT>