// New bool COpcXmlDocument::New(IXMLDOMElement* ipElement) { HRESULT hResult = S_OK; IXMLDOMElement* ipClone = NULL; IXMLDOMNode* ipParent = NULL; IXMLDOMNode* ipResult = NULL; TRY { // create new document instance. if (!New()) { THROW_(hResult, E_FAIL); } // clone the element. hResult = ipElement->cloneNode(VARIANT_TRUE, (IXMLDOMNode**)&ipClone); if (FAILED(hResult)) { THROW(); } // remove clone from parent. hResult = ipClone->get_parentNode(&ipParent); if (FAILED(hResult)) { THROW(); } if (ipParent != NULL) { hResult = ipParent->removeChild(ipClone, &ipResult); if (FAILED(hResult)) { THROW(); } if (ipResult != NULL) { ipResult->Release(); ipResult = NULL; } } // add root element to document. hResult = m_ipDocument->appendChild(ipClone, &ipResult); if (FAILED(hResult)) { THROW(); } if (ipResult != NULL) { ipResult->Release(); ipResult = NULL; } // declare element as the document element. hResult = m_ipDocument->putref_documentElement(ipClone); if (FAILED(hResult)) { THROW(); } // add predefined namespaces AddNamespace(TAG_XSD, OPCXML_NS_SCHEMA); AddNamespace(TAG_XSI, OPCXML_NS_SCHEMA_INSTANCE); } CATCH { Clear(); } FINALLY { // release memory. if (ipClone != NULL) ipClone->Release(); if (ipParent != NULL) ipParent->Release(); if (ipResult != NULL) ipResult->Release(); } return SUCCEEDED(hResult); }