Click here to Skip to main content
15,895,799 members
Articles / Desktop Programming / ATL

XMLize Your Class

Rate me:
Please Sign up or sign in to vote.
4.17/5 (6 votes)
2 Apr 2001 244.4K   2K   40  
This article shows how to serialize a class into XML string.
// XMLHelper.h: Definition of the CXMLHelper class
/**********************************************************************************
//
// Copyright (C) Dhandapani Ammasai (dammasai@yahoo.com)
//
// This code can be freely used or modified for non commercial use provided that
// a) this copyright notice and license appear on all copies of the software;
//
**********************************************************************************/

#ifndef _XML_HELPER_H_
#define _XML_HELPER_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "resource.h"       // main symbols
#import "msxml.dll" 

/////////////////////////////////////////////////////////////////////////////
// CXMLHelper

class CXMLHelper
{
public:
	//Data Members
	CComPtr<MSXML::IXMLDOMDocument> m_pXMLDOMDoc;

	enum eXMLNodeType  //enum to indicate node type
	{
		NODE_START,
		NODE_VALUE,
		NODE_END,
		ATTRIBUTE,
		END
	};
	struct XMLNodeVarMap
	{
		_bstr_t	  szName; //Node name 
		VARTYPE   vt; //Datatype
		void*	pVar; //Variable to hold node value		
	};

	struct XMLNodeData   //describes xml data
	{
		eXMLNodeType  eNodeType; // Node Type
		_bstr_t	  szName;  //Node name
		VARIANT   vValue; //Node value
	};

public:
	//Methods
	//
	//Constructor
	CXMLHelper();
	//Destructor
	~CXMLHelper();
	//Adds a single node to pXMLCurNode
	MSXML::IXMLDOMNodePtr AddNode(XMLNodeData XMLDataSet,MSXML::IXMLDOMNodePtr pXMLCurNode);
	//Static method which removes all nodes from the XML DOM
	static void Empty(MSXML::IXMLDOMDocument* pDOM);
	//Removes all nodes from the XML DOM
	void Empty();
};

//Macros

//Start XML tree
#define START_XML()\
	CXMLHelper::XMLNodeData stNodeData;\
	VARIANT vNodeVal;

//end XML tree
#define END_XML() \
	stNodeData.eNodeType = CXMLHelper::END;\
	stNodeData.szName = "";\
	stNodeData.vValue.vt = VT_EMPTY;\
	pXMLCurNode = pXMLHelperObj->AddNode(stNodeData,pXMLCurNode);

//Start a xml element
#define START_XML_ELEMENT(Name) \
	stNodeData.eNodeType = CXMLHelper::NODE_START;\
	stNodeData.szName = Name;\
	stNodeData.vValue.vt = VT_EMPTY;\
	pXMLCurNode = pXMLHelperObj->AddNode(stNodeData,pXMLCurNode);

//end xml element
#define END_XML_ELEMENT() \
	stNodeData.eNodeType = CXMLHelper::NODE_END;\
	stNodeData.szName = "";\
	stNodeData.vValue.vt = VT_EMPTY;\
	pXMLCurNode = pXMLHelperObj->AddNode(stNodeData,pXMLCurNode);

#define XML_ELEMENT_STR(Name, Value)\
	START_XML_ELEMENT(Name)\
		XML_NODEVALUE_STR(Value)\
	END_XML_ELEMENT()

#define XML_ELEMENT_LONG(Name, Value)\
	START_XML_ELEMENT(Name)\
		XML_NODEVALUE_LONG(Value)\
	END_XML_ELEMENT()

#define XML_NODEVALUE_STR(Value) \
{\
	stNodeData.eNodeType = CXMLHelper::NODE_VALUE;\
	stNodeData.szName = "";\
	VariantInit(&vNodeVal);\
	vNodeVal.vt = VT_BSTR;\
	CComBSTR szTempValue = Value;\
	vNodeVal.bstrVal = szTempValue.Copy();\
	stNodeData.vValue = vNodeVal;\
	pXMLCurNode = pXMLHelperObj->AddNode(stNodeData,pXMLCurNode);\
}

#define XML_NODEVALUE_LONG(Value) \
{\
	stNodeData.eNodeType = CXMLHelper::NODE_VALUE;\
	stNodeData.szName = "";\
	VariantInit(&vNodeVal);\
	vNodeVal.vt = VT_I4;\
	vNodeVal.lVal = Value;\
	stNodeData.vValue = vNodeVal;\
	pXMLCurNode = pXMLHelperObj->AddNode(stNodeData,pXMLCurNode);\
}

#define XML_DECLARE_NODE_VAR_MAP(x)\
long lNodeCount;\
CXMLHelper::XMLNodeVarMap stNodeVarMap[x];

#define XML_NODE_VAR_MAP_COUNT lNodeCount

#define XML_NODE_VAR_MAP(NodeName,VarType,pVariable)\
	stNodeVarMap[lNodeCount].szName = _bstr_t(NodeName);\
	stNodeVarMap[lNodeCount].vt = VarType;\
	stNodeVarMap[lNodeCount++].pVar = pVariable;

#define START_XML_NODE_VAR_MAP()\
	lNodeCount = 0;

#define END_XML_NODE_VAR_MAP()

#define XML_NODEDATA(x)\
	stNodeData[x]

#define XML_HELPER(pXMLHelper)\
	CXMLHelper* pXMLHelperObj = pXMLHelper;

#define XML_SET_CURRENTNODE(pCurNode)\
MSXML::IXMLDOMNodePtr pXMLCurNode = pCurNode;

#define XML_GET_CURRENTNODE pXMLCurNode

#define XML_NODEVARMAP_STRUCT stNodeVarMap

#endif 

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


Written By
India India
Dhandapani Ammasai(Dan in short) is a software delivery manager at a top tier IT company in India.

Comments and Discussions