Visual C++ 8.0COMWindows VistaWindows 2003Visual Studio 2005Windows 2000Windows XPXMLMFC中级开发Visual StudioWindowsC++
CXml - MSXML 3.0/4.0/5.0/6.0 的封装类






4.99/5 (44投票s)
这个封装类会尝试使用机器上最新的 MSXML 版本,并且由于使用了 auto_ptr,使用起来非常方便。
引言
MSXML 是一个随 Windows / Office 和其他 Microsoft 产品一起发布的窗口组件,存在于所有 Windows 平台中。但是,MSXML 有不同的版本,从 2.6 到 6.0,这会导致很多问题。
这是一个 MSXML 3.0/4.0/5.0/6.0 的封装类库,旨在解决上述问题 -- 您不再需要担心不同机器上可用的 MSXML 版本。 此外,它还提供了一个易于使用的界面 -- XML 中的每个节点都被视为一个对象,您可以使用如下代码来定位一个节点。
xml.GetRoot()->GetChild(_T("a"))->GetChild(_T("b"))->GetChild(_T("c"))
示例代码
请在演示项目中找到示例代码。
Using the Code
复制 /CXml/*.* 目录中的所有文件,并将它们添加到您的项目中。
#include "Xml.h"
using namespace JWXml;
在这里,我为这些类添加了一个命名空间,您可以根据自己的喜好进行更改。
MSXML 版本
该类将尝试按以下顺序选择 MSXML 的版本
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) );
类概述
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;
};
历史
- v2.0
- 创建时间:2007-07-16
- v2.1
- 添加了
LoadXml
方法 - 添加了
GetVersion
方法 - 为
GetXXX
方法添加了 const - 将
ASSERT
定义为 ATL 的ATLASSERT
- 将
TRACE
定义为 ATL 的ATLTRACE
- V2.2
- 为
CXml::Open
添加了参数lpszRootName
- 移除了
CXml::GetLastError
- 添加了
CXml::AddNamespace
- 为支持命名空间,为
CXml::CreateNode
添加了两个新的重载 - V3.0
- 为
CXmlNode
和CXmlNodes
添加了另一个复制构造函数 - 为某些变量添加了
const
修饰符 - 添加了
CXmlNode::GetInnerXml
- 添加了
CXmlNode::GetOuterXml
- 添加了
CXml::Create
- 将
Create
的 MSXML 版本更改为 6.0 -> 3.0 -> 5.0 -> 4.0 - 为属性添加了命名空间支持
- 添加了一个名为
CXsl
的新类 - V3.1
- 添加了方法
CXml::SaveWithFormatted
(感谢 roel_) - 在
CXsl::TransformToFile
中重用CXml::SaveStreamToFile
- 添加
CXsl::AddParameter
以允许将参数传递给 XSLT - 如果存在
std::tr1::shared_ptr
,则使用它代替std::auto_ptr
- 将命名空间从
Generic
更改为JWXml
- V3.2
- 修复了 demo 中
Create
方法使用的错误。 - 升级到 VS2010