2

我试图简单地添加一个 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>
4

2 回答 2

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);
于 2013-11-04T21:00:21.093 回答
1
#1
$node->insertBefore($frag, $node->firstChild);
#2
$node->parentNode->insertAfter($frag, $node);
于 2013-11-04T21:05:09.033 回答