// [ここでsaveDoc へ srcDoc のツリーをコピー]の部分
{
// saveDocには既にrootNameのルート要素が作られているので
// コピーの簡素化のためにルート要素を削除
DOMNode* saveRoot = saveDoc->getDocumentElement();
if (saveRoot != NULL)
{
DOMNode* removedNode = saveDoc->removeChild(saveRoot);
removedNode->release();
}
WalkTreeOnCopy(saveDoc, (DOMNode*)saveDoc, srcDoc->getDocumentElement(), 0);
}
void WalkTreeOnCopy(DOMDocument* owner, DOMNode* destNode, DOMNode* srcNode, unsigned int depth)
{
// importNode(srcNode, true)でも良いとは思いますが
// 属性値を書き換える必要があったため、
// importNode(srcNode, false)で要素毎コピーを行い
// 再帰的に WalkTreeOnCopy を呼び出しています。
DOMNode* reaf = owner->importNode(srcNode, false);
DOMNode* newNode = destNode->appendChild(reaf);
// Set the linked attribute value.
DOMNamedNodeMap* attrList = newNode->getAttributes();
if (attrList)
{
// ...
}
DOMNodeList* nodeList = srcNode->getChildNodes();
size_t childNodeCount = nodeList->getLength();
for (size_t index = 0; index < childNodeCount; index++)
{
DOMNode* childNode = nodeList->item(index);
WalkTreeOnCopy(owner, newNode, childNode, depth + 1); // 再帰呼び出し
}
}
|