挿入されるノードが別のドキュメントからのものである(つまり、参照ノードおよび挿入されるノードとは異なる)DOMNodeのinsertBeforeメソッドを呼び出そうとすると、PHPランタイムがDOMExceptionを生成し、メッセージが「変更不可エラー」。
挿入されているノードについての言及が読み取り専用であることがわかりましたが、この問題に関するドキュメントはまばらなようです。
私が見つけた回避策は、別のドキュメントからのノードのクローンを作成し、そのクローンを挿入することです。例:
foreach($nodeChildren as $child) {
$clone = $child->cloneNode(true);
$parentNode->insertBefore($clone, $nodeToInsertInFrontOf);
}
私の質問は2つあります:
1)挿入を実行するためにこのノードのクローンを作成する必要があるのはなぜですか?
2)これはこのアクションを実行する最も効率的な方法ですか(複製された子ノードに複数の子と孫の深い階層のいくつかのレベルが含まれている可能性があると仮定します)?