Perl LibXML - InsertAfter / addSibling

时间:2013-11-04 20:40:28

标签: perl libxml2

我正在尝试简单地添加一个xml代码块(来自parsed_balance_chunk),测试尝试添加子项和兄弟的效果。我正在玩“插入后”和“插入”。 “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>

2 个答案:

答案 0 :(得分:1)

来自XML::LibXML::Node->insertNode($newNode, $refNode)的文档:

The method inserts $newNode before $refNode. If $refNode is
undefined, the newNode will be set as the new last child of the
parent node.  This function differs from the DOM L2 specification,
in the case, if the new node is not part of the document, the node
will be imported first, automatically.

...所以,如果你想把它作为新的第一个孩子插入,你需要获得当前第一个子节点的句柄,如下所示:

$node->insertBefore($frag, $node->firstChild);

答案 1 :(得分:1)

#1
$node->insertBefore($frag, $node->firstChild);
#2
$node->parentNode->insertAfter($frag, $node);