|
|
|||||||||
|
|||||||||
| |||||||||
|
|
|
| |||||||||
![]() |
|
|
«
Previous Thread
|
Next Thread
»
|
Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
Hi Everyone, I am trying build an xml file using msxml dom object. The xml file will have a root node with a single attribute and child node. I got the root node and attribute working but having problems appending the child node to the root. I create the node with out a problem but everytime time i try to appendChild , it returns E_FAILED code. I have used msdn's sample code (since i'm new to msxml) .. can someone take a look at my code see what I am doing wrong. The function in which I create all my xml nodes and use appendChild is called createXMLFile(). Thanks a bunch! THE CODE: #include "StdAfx.h" #include "NI.h" #include <stdlib.h> #include <iostream.h> #include <Windows.h> #include <stdio.h> // for msdn functions //include xml dom headers and libraries automatically #import <msxml4.dll> raw_interfaces_only using namespace MSXML2; // Macro that calls a COM method returning HRESULT value: #define HRCALL(a, errmsg, i) \ do { \ hr = (a); \ if (FAILED(hr)) { \ cout<<"**Failed:"<<i<<endl;\ goto clean; \ } \ } while (0) void AddWhiteSpaceToNode(IXMLDOMDocument *pDom, BSTR bstrWs, IXMLDOMNode *pNode); IXMLDOMDocument * DomFromCOM(); void AppendChildToParent(IXMLDOMNode *pChild, IXMLDOMNode *pParent); VARIANT VariantString(BSTR str); void dprintf(char *format, ...); int createXMLFile(); void main() { createXMLFile(); } //THE PROBLEM int createXMLFile() { IXMLDOMDocument *pXMLDom=NULL; IXMLDOMProcessingInstruction *pi=NULL; IXMLDOMNode *pNode = NULL; IXMLDOMNode *pRoot = NULL; IXMLDOMAttribute *pAttr = NULL; IXMLDOMNamedNodeMap *pAttrMap = NULL; IXMLDOMElement *pElem = NULL; IXMLDOMNode *pTempNode = NULL; IXMLDOMElement *pe =NULL; BSTR bstr = NULL; BSTR bstr1 = NULL; VARIANT var; HRESULT hr; _variant_t varNodeType((short)MSXML2::NODE_ELEMENT); _variant_t varAttrType((short)MSXML2::NODE_ATTRIBUTE); _variant_t varTemp; CoInitialize(NULL); VariantInit(&var); pXMLDom = DomFromCOM(); if (!pXMLDom) goto clean; // Create a processing instruction element. bstr = SysAllocString(L"xml"); bstr1 = SysAllocString(L"version='1.0'"); HRCALL(pXMLDom->createProcessingInstruction( bstr,bstr1, &pi), "createProcessingInstruction:", 11); AppendChildToParent(pi, pXMLDom); pi->Release(); pi=NULL; SysFreeString(bstr); bstr=NULL; SysFreeString(bstr1); bstr1=NULL; // Create the root element and add to xmldoc bstr = SysAllocString(L"ns1:networkElement"); bstr1 = SysAllocString(L"http://somelink.com"); HRCALL(pXMLDom->createNode(varNodeType, bstr, bstr1, &pRoot), "", 12); AppendChildToParent(pRoot, pXMLDom); SysFreeString(bstr1); bstr1 = NULL; SysFreeString(bstr); bstr = NULL; // Create a "id" attribute for the <root> element, and // assign the "annabell" character data as the attribute value. bstr = SysAllocString(L"id"); var = VariantString(L"annabelle"); HRCALL(pXMLDom->createAttribute(bstr, &pAttr), "", 14); HRCALL(pAttr->put_nodeTypedValue(var), "", 15); HRCALL(pRoot->get_attributes(&pAttrMap), "", 16); HRCALL(pAttrMap->setNamedItem(pAttr, &pRoot), "", 17); SysFreeString(bstr); bstr = NULL; // Create a <node1> to hold text content. bstr = SysAllocString(L"includelist"); bstr1= SysAllocString(L""); HRCALL(pXMLDom->createNode(varNodeType, bstr, bstr1, &pNode),"", 19.1); SysFreeString(bstr); SysFreeString(bstr1); bstr=NULL; bstr1=NULL; VariantClear(&var); var.vt = NULL; //THIS ALWAYS FAILS!!! .. WHY??? if (pRoot->appendChild(pNode, &pTempNode) == E_FAIL) { cout<<"Failed! :-(( "<<endl; } pNode->Release(); pNode=NULL; VariantClear(&var); var = VariantString(L"dynamDom.xml"); HRCALL(pXMLDom->save(var), "", 20); dprintf("DOM saved to dynamDom.xml\n"); clean: if (bstr) SysFreeString(bstr); if (bstr1) SysFreeString(bstr1); if (&var) VariantClear(&var); if (pRoot) pRoot->Release(); if (pNode) pNode->Release(); CoUninitialize(); return 0; } //THESE METHODS COPIED DIRECTLY FROM MSDN SITE: //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/dom_hdi_823x.asp // Helper function to append a whitespace text node to a // specified element: void AddWhiteSpaceToNode(IXMLDOMDocument* pDom, BSTR bstrWs, IXMLDOMNode *pNode) { HRESULT hr; IXMLDOMText *pws=NULL; IXMLDOMNode *pBuf=NULL; HRCALL(pDom->createTextNode(bstrWs,&pws), " ", 9); HRCALL(pNode->appendChild(pws,&pBuf)," ", 10); clean: if (pws) pws->Release(); pws=NULL; if (pBuf) pBuf->Release(); pBuf=NULL; } // Helper function to create a DOM instance. IXMLDOMDocument * DomFromCOM() { HRESULT hr; IXMLDOMDocument *pxmldoc = NULL; HRCALL( CoCreateInstance(__uuidof(DOMDocument40), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMDocument), (void**)&pxmldoc), "Create a new DOMDocument", 31); HRCALL( pxmldoc->put_async(VARIANT_FALSE), "should never fail", 32); HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE), "should never fail", 33); HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE), "should never fail", 34); HRCALL( pxmldoc->put_preserveWhiteSpace(VARIANT_TRUE), "should never fail",35); return pxmldoc; clean: if (pxmldoc) { pxmldoc->Release(); } return NULL; } // Helper function to append a child to a parent node: void AppendChildToParent(IXMLDOMNode *pChild, IXMLDOMNode *pParent) { HRESULT hr; IXMLDOMNode *pNode=NULL; HRCALL(pParent->appendChild(pChild, &pNode), "", 36); clean: if (pNode) pNode->Release(); pNode=NULL; } VARIANT VariantString(BSTR str) { VARIANT var; VariantInit(&var); V_BSTR(&var) = SysAllocString(str); V_VT(&var) = VT_BSTR; return var; } 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); } |
|
#2
|
|||
|
|||
|
Do u still have this problem?
The date is from the middle age... Quique |
![]() |
| Viewing: Dev Shed Forums > Programming Languages - More > XML Programming > XML DOM: problem using appendChild with IXMLDOMNode |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|
|
|