This C/C++ source code performs the following steps:
pXMLDom
) and sets it to synchronous mode.pXMLDom.
loadXML
method on pXMLDom
, specifying the XML data as the following string:
<r>\n<t>top</t>\n<b>bottom</b>\n</r>
save
method on pXMLDom
to serialize the DOM content to a file (myData.xml).C/C++ Source File (saveDOM.cpp)
#include <stdio.h> #include <windows.h> #import <msxml5.dll> raw_interfaces_only using namespace MSXML2; // Macro that calls a COM method returning HRESULT value: #define HRCALL(a, errmsg) \ do { \ hr = (a); \ if (FAILED(hr)) { \ dprintf( "%s:%d HRCALL Failed: %s\n 0x%.8x = %s\n", \ __FILE__, __LINE__, errmsg, hr, #a ); \ goto clean; \ } \ } while (0) // Helper function that puts output in stdout and debug window // in Visual Studio: void dprintf( char * format, ...) { static char buf[1024]; va_list args; va_start( args, format ); vsprintf( buf, format, args ); va_end( args); OutputDebugStringA( buf); printf("%s", buf); } // Helper function to create a DOM instance: IXMLDOMDocument * DomFromCOM() { HRESULT hr; IXMLDOMDocument *pxmldoc = NULL; HRCALL( CoCreateInstance(__uuidof(DOMDocument50), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMDocument), (void**)&pxmldoc), "Create a new DOMDocument"); HRCALL( pxmldoc->put_async(VARIANT_FALSE), "should never fail"); HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE), "should never fail"); HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE), "should never fail"); return pxmldoc; clean: if (pxmldoc) { pxmldoc->Release(); } return NULL; } int main(int argc, char* argv[]) { IXMLDOMDocument *pXMLDom=NULL; IXMLDOMParseError *pXMLErr=NULL; BSTR bstr = NULL; VARIANT_BOOL status; VARIANT var; HRESULT hr; CoInitialize(NULL); pXMLDom = DomFromCOM(); if (!pXMLDom) goto clean; bstr = SysAllocString(L"<r>\n<t>top</t>\n<b>bottom</b>\n</r>"); HRCALL(pXMLDom->loadXML(bstr, &status), "dom->loadXML(): "); SysFreeString(bstr); if (status!=VARIANT_TRUE) { HRCALL(pXMLDom->get_parseError(&pXMLErr), "dom->get_parseError: "); HRCALL(pXMLErr->get_reason(&bstr), "parseError->get_reason: "); dprintf("Failed to load DOM from xml string. %S\n", bstr); goto clean; } HRCALL(pXMLDom->get_xml(&bstr), "dom->get_xml: "); dprintf("XML DOM loaded from stocks.xml:\n%S\n",bstr); VariantInit(&var); V_BSTR(&var) = SysAllocString(L"myData.xml"); V_VT(&var) = VT_BSTR; HRCALL(pXMLDom->save(var), "dom->save: "); dprintf("XML DOM saved to myData.xml\n"); clean: if (bstr) SysFreeString(bstr); if (&var) VariantClear(&var); if (pXMLErr) pXMLErr->Release(); if (pXMLDom) pXMLDom->Release(); CoUninitialize(); return 0; }
To add saveDOM.cpp to the project
Next, build and run the saveDOM project. The result should be the output shown in the following topic.