2015-11-03 103 views
1

我目前与2010年xerces_3_1 adoptNode()方法返回NULL

我写这个(很简单)的代码在Visual Studio 3.1的Xerces工作:

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(...)方法将总是返回一个空指针,无论如何。我真的不明白这里发生了什么,请帮助我!

PS:我知道我可以使用importNode(...)方法和删除,并从旧文件释放旧的节点,但我希望能有办法解决我的问题adoptNode(...)

回答

0

了Xerces API国adoptNode(DOMNode* source)如下:

更改一个节点,其子女的ownerDocument,以及附加的属性节点,如果有任何。

经过一番研究,我看到了xerces 3.1中采纳节点的实现,可悲的是,这是不可能的。引用的源代码:

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解决方法)