xerces_3_1 adoptNode() 方法 returns NULL

xerces_3_1 adoptNode() method returns NULL

我目前在 visual studio 2010 年使用 xerces 3.1。

我写过这段(非常简单的)代码:

XMLPlatformUtils::Initialize();
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(L"XML 1.0");

DOMDocument* doc1 = impl->createDocument(L"nsURI", L"abc:root1", 0);
DOMDocument* doc2 = impl->createDocument(0, L"root2", 0);
DOMElement* root1 = doc1->getDocumentElement();
DOMElement* root2 = doc2->getDocumentElement();

DOMElement* el1 = doc1->createElement(L"el1");
root1->appendChild(el1);

DOMNode* tmpNode = doc2->adoptNode(el1);    //tmpNode is null after this line
root2->appendChild(tmpNode);

doc1->release();
doc2->release();
xercesc::XMLPlatformUtils::Terminate();

问题是,无论如何,adoptNode(...) 方法总是return 一个空指针。我真的不明白这是怎么回事,请帮助我!

PS:我知道我可以使用 importNode(...) 方法并从旧文档中删除并释放旧节点,但我希望有一种方法可以解决 adoptNode(...)!

xerces api 为 adoptNode(DOMNode* source) 声明如下:

Changes the ownerDocument of a node, its children, as well as the attached attribute nodes if there are any.

经过一些研究,我查看了 xerces 3.1 中 adoptNode 的实现,可悲的事实是这是不可能的。引用源码:

if(sourceNode->getOwnerDocument()!=this)
{
    // cannot take ownership of a node created by another document, as it comes from its memory pool
    // and would be delete when the original document is deleted
    return 0;
}

编辑:

此方法有一个变通方法,但它需要一些 DOM- 实现方面的知识(尤其是在使用 UserData 时)。您可以使用 importNode(...) 导入节点并从旧文档中删除另一个节点。

应该释放旧节点,以免浪费内存!

如果你有用户数据附加到旧节点,新文档必须有一些UserDataHandler,它采用从旧节点到新节点的用户数据!

请注意,旧节点上的可能引用现在不会指向新节点。它们必须手动更改(或使用一些 UserDataHandler 解决方法)