2

プロジェクトで Xerces-c を使用していDOMElementますが、まったく新しいDOMDocument. そのようなことは可能ですか?

4

1 に答える 1

3

私は方法を見たことがありません。私の知る限り、DOMDocument は「メモリ プール」として機能し、すべての要素がこのプールに作成されます。Xerces のドキュメントには次のように記載されています。

DOMDocument::createXXXX によって作成されたオブジェクト ユーザーは release() 関数を呼び出して、孤立したノードの解放を示すことができます。孤立したノードが解放されると、それに関連付けられた子ノードも解放されます。解放されたノードにアクセスすると、予期しない動作が発生します。これらの孤立したノードは、所有者のドキュメントが解放されたときに、まだ解放されていない場合は最終的に解放されます。

この状況を回避するには、スクラッチ パッドDOMDocument を保持し、それを使用してフラグメントまたは孤立ノードを作成し、準備ができたらそれらを目的のドキュメントに採用しました。例えば

// Create a fragment holding two sibling elements. The first element also has a child.
DOMDocumentFragment* frag = scratchDom->createDocumentFragment();
DOMNode* e1 = frag->appendChild( frag->getOwnerDocument()->createElement("e1") );
e1->appendChild( e1->getOwnerDocument()->createElement("e1-1") );
DOMNode* e2 = frag->appendChild( frag->getOwnerDocument()->createElement("e2") );
...
// Paste the contents of the fragment into a "parent" node from another document
DOMNode* parentFromOtherDom = ...;
parentFromOtherDom->appendChild( parentFromOtherDom->getOwnerDocument()->adopt(frag) );
scratchDom->removeChild(frag);
于 2008-10-22T03:35:13.067 に答える