i'm currently working with xerces 3.1 in visual studio 2010.
I've written this (very simple) piece of code:
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();
The problem is, the adoptNode(...)
method will always return a null-pointer no matter what. I really don't understand what's going on here, please help me!
PS: I know i could use the importNode(...)
method and remove and release the old node from the old document, but i was hoping there was a way to fix my problem with adoptNode(...)
!
The xerces api states the following for adoptNode(DOMNode* source)
:
Changes the ownerDocument of a node, its children, as well as the attached attribute nodes if there are any.
After some research i took a look at the implementation of adoptNode in xerces 3.1 and the sad truth is that it's not possible. Quoting the sourcecode:
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;
}
EDIT:
There is a workaround for this method but it requires some knowledge of the DOM-Implementation (especially when using UserData). You can import the node with importNode(...)
and delete the other node out of the old document.
The old nodes should be released in order to not waste memory!
If you've got userdata attached to the old nodes, the new document has to have some UserDataHandler
which adopts the userdata from the old node to the new node!
Please note that possible references on the old nodes do not point onto the new nodes now. They'll have to be changed manually (or with some UserDataHandler workaround)