Perl LibXML-InsertAfter/addSibling

Perl LibXML-InsertAfter/addSibling,perl,libxml2,Perl,Libxml2,我试图简单地添加一块xml代码(来自已解析的\u balance\u块),测试尝试添加子项和兄弟项的效果。我正在使用“insertAfter”和“addSibling”来测试如何在xml的不同部分插入片段。加上“insertAfter”(就此而言,“insertBefore”),它将其添加为“C”的最后一个子项。1.)如何使其作为“C”的第一个子项插入(即在“D”之前)?2.)通过另一个测试,我如何让它成为“C”的兄弟姐妹?当我尝试“addSibling”时,它会弹出一条消息,说“正在使用add

我试图简单地添加一块xml代码(来自已解析的\u balance\u块),测试尝试添加子项和兄弟项的效果。我正在使用“insertAfter”和“addSibling”来测试如何在xml的不同部分插入片段。加上“insertAfter”(就此而言,“insertBefore”),它将其添加为“C”的最后一个子项。1.)如何使其作为“C”的第一个子项插入(即在“D”之前)?2.)通过另一个测试,我如何让它成为“C”的兄弟姐妹?当我尝试“addSibling”时,它会弹出一条消息,说“正在使用addSibling添加文档片段,但还不支持!”

另外,对于$frag的定义,如果我在foreach外观之外定义它,它只会将$frag添加到第一个节点(而不是第二个出现的“C”)

代码:

使用警告;
严格使用;
使用XML::LibXML;
使用数据::转储程序;
my$parser=XML::LibXML->new({keep_blanks=>(0)});
my$dom=$parser->load_xml(location=>'test_in.xml')或die;
my@nodes=$dom->findnodes('//E/./..');
foreach my$node(@nodes)
{
my$frag=$parser->parse_balanced_chunk(“yyyzz”);
$node->insertBefore($frag,unde);
#$node->addSibling($frag);
}
打开我的$FH,“>”,“test_out.xml”;
打印{$FH}$dom->toString(1);
收盘价($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>

扎布
ZBW
ZSE
ZLC
1
输出文件:

<?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>

扎布
ZBW
ZSE
ZLC
yyy
zz
一
yyy
zz

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

…因此,如果希望将其作为新的第一个子节点插入,则需要在当前第一个子节点上获取句柄,如下所示:

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

将$ref设置为$node->firstChild工作!!我不知道为什么,尽管我不能显式地设置$ref(例如“D”)。非常感谢。因为
D
不是节点。这只是一封信。对不起,我不知道你的问题到底是什么。我之所以要添加一个片段,是因为我有一大块需要插入的xml节,而“parsed_balance-chunk”正好适合。
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
$node->insertBefore($frag, $node->firstChild);
#2
$node->parentNode->insertAfter($frag, $node);