Jump to content
bc-vnt

CXml - A Wrapping Class for MSXML 3.0/4.0/5.0/6.0

Recommended Posts

Introduction

MSXML, a window component shipped with Windows / Office and other microsoft products, exists in all windows platforms. But there are different versions of MSXML, from 2.6 to 6.0, which causes a lot of problems.

This is a wrapping class library for MSXML 3.0/4.0/5.0/6.0 consisting of resolving the above problem -- you don't need worry about the available MSXML version on different machines any more.

and also it provides easy-to-use interface -- each node in the xml is considered as an object and you can use some code like below to locate a node.

xml.GetRoot()->GetChild(_T("a"))->GetChild(_T("b"))->GetChild(_T("c")) 

Sample Code

Please find the sample code in the demo project.

demo.jpg

Using the Code

Copy all the files in the /CXml/*.* directory and add them into your project.

#include "Xml.h"
using namespace JWXml;

Here, I have added a namespace for the classes, you can change it as you like.

MSXML Version

The class will try to choose the version of MSXML in the following order:

hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60) );
hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument30) );
hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument50) );
hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument40) );
hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument26) );
hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument) );

Classes Overview

CXml

class CXml
{
friend class CXsl;

public:
CXml(void);
~CXml(void);

protected:
MSXML2::IXMLDOMDocument2Ptr m_pDoc;
CString m_strFilePath;
MSXML_VERSION m_emVersion;
std::map< CString, CString> m_mpNamespace;

BOOL CreateInstance(void);

public:
// Open XML file
BOOL Open(LPCTSTR lpszXmlFilePath);

// Create a new XML file
BOOL Create( LPCTSTR lpszRootName = _T("xmlRoot")
, LPCTSTR lpszPrefix = _T("")
, LPCTSTR lpszNamespaceURI = _T("")
);

// Load XML string
BOOL LoadXml(LPCTSTR lpszXmlContent);

// save XML file
BOOL Save(LPCTSTR lpszFilePath);

// save XML file with formatted output
BOOL SaveWithFormatted(LPCTSTR lpszFilePath = NULL,
LPCTSTR lpszEncoding = _T("UTF-8"));

// close XML file
void Close(void);

CString GetXmlFile(void) const;

// Encode the binary data into string
CString Base64Encode( LPBYTE pBuf, ULONG ulSize);

// Decode the string into binary data
BOOL Base64Decode( CString strIn, LPBYTE pBuf, LONG & lSize);

// namespace
void AddSelectionNamespace( LPCTSTR lpszPrefix, LPCTSTR lpszURI);

// get the root element of
CXmlNodePtr GetRoot(void);

// get single node by XPath
CXmlNodePtr SelectSingleNode(LPCTSTR lpszPath);

// get nodes by XPath
CXmlNodesPtr SelectNodes(LPCTSTR lpszPath);

// create node
CXmlNodePtr CreateNode(LPCTSTR lpszName
, LPCTSTR lpszPrefix = _T("")
, LPCTSTR lpszNamespaceURI = _T("")
);

// get the current version of MSXML
MSXML_VERSION GetVersion(void) const;
};

CXmlNode

class CXmlNode
{
friend class CXml;
friend class CXmlNode;
friend class CXmlNodes;

protected:
MSXML2::IXMLDOMNodePtr m_pNode;

CXmlNode( MSXML2::IXMLDOMNodePtr pNode);

BOOL _GetValue(CString & strValue) const;
BOOL _SetValue(CString & strValue) const;

BOOL _GetAttribute( CString & strName, CString & strValue) const;
BOOL _SetAttribute( CString & strName IN
, CString & strValue IN
, CString & strPrefix IN
, CString & strNamespaceURI IN
) const;

public:

CXmlNode(void);
CXmlNode(const CXmlNode & refNode IN);
CXmlNode(const CXmlNodePtr pNode IN);
~CXmlNode(void);

CXmlNodePtr operator = (CXmlNodePtr pNode);
CXmlNode & operator = (const CXmlNode & refNode);

BOOL IsNull(void) const; // Whether the current element exist
CString GetName(void) const;// Get the name of the current node
CXmlNode & Detach(void); // Detach the current node
void Release(void); // Release this node

CXmlNodePtr GetChild( CString strName, BOOL bBuildIfNotExist = TRUE);
CXmlNodePtr NewChild( CString strName );
CXmlNodePtr GetParent(void);
CXmlNodesPtr GetChildren();
void AttachChild( CXmlNodePtr & pChildNode);
void AttachChild( CXmlNode & refChildNode);
BOOL HasChildren(void);
BOOL RemoveChildren(void);

CString GetAttribute( CString strName, LPCTSTR lpszDefault = NULL) const;
bool GetAttribute( CString strName, bool bDefault) const;
int GetAttribute( CString strName, int nDefault) const;
long GetAttribute( CString strName, long lDefault) const;
__int64 GetAttribute( CString strName, __int64 llDefault) const;
float GetAttribute( CString strName, float fDefault) const;
double GetAttribute( CString strName, double dDefault) const;
DWORD GetAttribute( CString strName, DWORD dwDefault) const;

BOOL SetAttribute( CString strName, LPCTSTR lpszValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, bool bValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, int nValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, long lValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, __int64 llValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, float fValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, double dValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));
BOOL SetAttribute( CString strName, DWORD dwValue ,
CString strPrefix = _T(""), CString strNamespaceURI = _T(""));

BOOL RemoveAttribute( CString strName );

CString GetValue( LPCTSTR lpszDefault = NULL ) const;
bool GetValue( bool bDefault ) const;
int GetValue( int nDefault) const;
long GetValue( long lDefault) const;
__int64 GetValue( __int64 llDefault) const;
float GetValue( float fDefault) const;
double GetValue( double dDefault) const;
DWORD GetValue( DWORD dwDefault) const;

BOOL SetValue( LPCTSTR lpszValue );
BOOL SetValue( bool bValue );
BOOL SetValue( int nValue );
BOOL SetValue( long lValue );
BOOL SetValue( __int64 llValue );
BOOL SetValue( float fValue );
BOOL SetValue( double dValue );
BOOL SetValue( DWORD dwValue );

CXmlNodePtr SelectSingleNode(LPCTSTR lpszPath);
CXmlNodesPtr SelectNodes(LPCTSTR lpszPath);

CString GetOuterXml(void) const;
CString GetInnerXml(void) const;
};

CXmlNodes

class CXmlNodes
{
friend class CXml;
friend class CXmlNode;
friend class CXmlNodes;

public:
~CXmlNodes(void);
CXmlNodes(void);
CXmlNodes( const CXmlNodes & refNodes );
CXmlNodes( CXmlNodesPtr pNodes );

CXmlNodesPtr operator = (CXmlNodesPtr pNodes);
CXmlNodes & operator = (const CXmlNodes & refNodes);
CXmlNodePtr operator[] ( LONG lIndex );
CXmlNodePtr operator[] ( LPCTSTR lpszName );

LONG GetCount(void);
void Release(void);

CXmlNodePtr GetItem( LONG nIndex );
CXmlNodePtr GetItem( LPCTSTR lpszName );

protected:
CXmlNodes(MSXML2::IXMLDOMNodeListPtr pNodeList);
MSXML2::IXMLDOMNodeListPtr m_pNodeList;

};

CXsl

class CXsl
{
public:
CXsl(void);
~CXsl(void);

// Open XSL file
BOOL Open(LPCTSTR lpszXslFilePath);

// close XSL file
void Close(void);

// transform to file
BOOL TransformToFile( CXml & objXml, LPCTSTR lpszFilePath);

// add a parameter
BOOL AddParameter( LPCTSTR lpszParamName, LPCTSTR lpszParamValue,
LPCTSTR lpszNamespaceURI = NULL);

protected:
MSXML2::IXSLTemplatePtr m_pIXSLTemplate;
MSXML2::IXMLDOMDocument2Ptr m_pStyleSheet;
MSXML2::IXSLProcessorPtr m_pIXSLProcessor;
};

History

v2.0

Created: 2007-07-16

v2.1

Added LoadXml method

Added GetVersion method

Added const for GetXXX methods

Defined ASSERT as ATLASSERT for ATL

Defined TRACE as ATLTRACE for ATL

V2.2

Added the parameter lpszRootName for CXml::Open

Removed CXml::GetLastError

Added CXml::AddNamespace

Added two new overrides for CXml::CreateNode with namespace support

V3.0

Added another copy constructor for CXmlNode and CXmlNodes

Added const modifier for some variables

Added CXmlNode::GetInnerXml

Added CXmlNode::GetOuterXml

Added CXml::Create

Changed the MSXML version for Create to 6.0 -> 3.0 -> 5.0 -> 4.0

Added namespace support for attributes

Added a new class named CXsl

V3.1

Add method CXml::SaveWithFormatted (Thanks to roel_)

Reuse CXml::SaveStreamToFile in CXsl::TransformToFile

Add CXsl::AddParameter to allow passing parameters to XSLT

Use std::tr1::shared_ptr if exists instead of std::auto_ptr

Change namespace from Generic to JWXml

V3.2

Bug fix for the Create method usage in demo.

Upgrade to VS2010

Download source (version 3.0)

Download source (version 3.1)

Download source (version 3.2)

http://www.codeproject.com/Articles/19624/CXml-A-Wrapping-Class-for-MSXML-3-0-4-0-5-0-6-0

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...