- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前在 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(...)
方法无论如何都会返回一个空指针。我真的不明白这是怎么回事,请帮助我!
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 解决方法)
关于c++ - xerces_3_1 adoptNode() 方法返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494063/
我目前在 visual studio 2010 中使用 xerces 3.1。 我写了这段(非常简单的)代码: XMLPlatformUtils::Initialize(); DOMImplement
我有一个类似于 xml XML1 还有另一个类似 的 XML 2 如果我这样做 DocumentBuilder builder = fact
这是交易(过度简化了一点) 我正在创建一个具有“选项卡”的应用程序,每个选项卡都可以显示与 iFrame 类似的内容。 所以,我希望在选项卡开关之间共享这些,因为来自 iFrame 加载的初始请求有点
我正在使用 XHR(XML Http 请求)加载 html 片段。我正在使用 responseType = "document"以将 html 解析卸载到浏览器。当 ajax 调用完成时,我使用 do
我是一名优秀的程序员,十分优秀!