XML Programming
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me
Go Back   Dev Shed ForumsProgramming Languages - MoreXML Programming

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
  #1  
Old June 25th, 2003, 12:49 PM
lenochka lenochka is offline
Junior Member
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Jun 2003
Posts: 11 lenochka User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Question XML DOM: problem using appendChild with IXMLDOMNode



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);
}

Reply With Quote
  #2  
Old March 24th, 2004, 10:16 AM
quique quique is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Mar 2004
Location: Ravensburg (Germany)
Posts: 7 quique User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 1 h 58 m 43 sec
Reputation Power: 0
Do u still have this problem?


The date is from the middle age...

Quique

Reply With Quote
Reply

Viewing: Dev Shed ForumsProgramming Languages - MoreXML Programming > XML DOM: problem using appendChild with IXMLDOMNode


Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump


Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 





© 2003-2008 by Developer Shed. All rights reserved. DS Cluster 6 hosted by Hostway
Stay green...Green IT