/ / Perl LibXML-InsertAfter / addSibling-perl、libxml2

Perl LibXML - InsertAfter / addSibling - perl、libxml2

私は単純にXMLコードのブロックを追加しようとしています(parsed_balance_chunkから)、子を兄弟として追加しようとした結果をテストします。 「insertAfter」と「addSibling」の両方で遊んで、xmlのさまざまなセクションにフラグメントを挿入する方法をテストしています。 「C」1.)「C」の最初の子として(つまり「D」の前に)挿入するにはどうすればよいですか?2.)別のテストで、「C」の兄弟になるにはどうすればよいですか? 「addSibling」を試してみると、「addSiblingでドキュメントフラグメントを追加することはまだサポートされていません!」というメッセージが返されます。

また、$ fragの定義では、foreachルックの外部で定義すると、最初のノードにのみ$ fragが追加されます(「C」の2番目の出現ではありません)。

コード:

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>

回答:

回答№1は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);

回答№2の場合は1
#1
$node->insertBefore($frag, $node->firstChild);
#2
$node->parentNode->insertAfter($frag, $node);