MSXML 是一个随 Windows 和 Office 等 Microsoft 产品一起分发的 Windows 组件。它存在于所有 Windows 平台上,但存在从 2.6 到 6.0 不同版本的 MSXML,这导致了许多问题。为了解决这个问题,开发了一个包装类库,它支持 MSXML 3.0/4.0/5.0/6.0 版本,使得开发者不再需要担心不同机器上可用的 MSXML 版本。此外,它还提供了一个易于使用的接口,每个 XML 节点都被视为一个对象,可以使用如下代码来定位节点:
xml.GetRoot()->
GetChild(_T("a"))->
GetChild(_T("b"))->
GetChild(_T("c"));
请在演示项目中查找示例代码。
将 /CXml/*.* 目录中的所有文件复制并添加到项目中。
#include "Xml.h"
using namespace JWXml;
在这里,为类添加了一个命名空间,可以根据需要进行更改。
类将尝试按照以下顺序选择 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));
class CXml {
friend class CXsl;
public:
CXml(void);
~CXml(void);
protected:
MSXML2::IXMLDOMDocument2Ptr m_pDoc;
CString m_strFilePath;
MSXML_VERSION m_emVersion;
std::map m_mpNamespace;
BOOL CreateInstance(void);
public:
// 打开 XML 文件
BOOL Open(LPCTSTR lpszXmlFilePath);
// 创建一个新的 XML 文件
BOOL Create( LPCTSTR lpszRootName = _T("xmlRoot"), LPCTSTR lpszPrefix = _T(""), LPCTSTR lpszNamespaceURI = _T(""));
// 加载 XML 字符串
BOOL LoadXml(LPCTSTR lpszXmlContent);
// 保存 XML 文件
BOOL Save(LPCTSTR lpszFilePath);
// 保存 XML 文件并格式化输出
BOOL SaveWithFormatted(LPCTSTR lpszFilePath = NULL, LPCTSTR lpszEncoding = _T("UTF-8"));
// 关闭 XML 文件
void Close(void);
CString GetXmlFile(void) const;
// 将二进制数据编码为字符串
CString Base64Encode( LPBYTE pBuf, ULONG ulSize);
// 将字符串解码为二进制数据
BOOL Base64Decode( CString strIn, LPBYTE pBuf, LONG & lSize);
// 命名空间
void AddSelectionNamespace( LPCTSTR lpszPrefix, LPCTSTR lpszURI);
// 获取根元素
CXmlNodePtr GetRoot(void);
// 通过 XPath 获取单个节点
CXmlNodePtr SelectSingleNode(LPCTSTR lpszPath);
// 通过 XPath 获取节点列表
CXmlNodesPtr SelectNodes(LPCTSTR lpszPath);
// 创建节点
CXmlNodePtr CreateNode(LPCTSTR lpszName, LPCTSTR lpszPrefix = _T(""), LPCTSTR lpszNamespaceURI = _T(""));
// 获取当前 MSXML 版本
MSXML_VERSION GetVersion(void) const;
};
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;
// 是否当前元素存在
CString GetName(void) const;
// 获取当前节点的名称
CXmlNode & Detach(void);
// 分离当前节点
void Release(void);
// 释放此节点
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;
};
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;
};
class CXsl {
public:
CXsl(void);
~CXsl(void);
// 打开 XSL 文件
BOOL Open(LPCTSTR lpszXslFilePath);
// 关闭 XSL 文件
void Close(void);
// 转换到文件
BOOL TransformToFile( CXml & objXml, LPCTSTR lpszFilePath);
// 添加一个参数
BOOL AddParameter( LPCTSTR lpszParamName, LPCTSTR lpszParamValue, LPCTSTR lpszNamespaceURI = NULL);
protected:
MSXML2::IXSLTemplatePtr m_pIXSLTemplate;
MSXML2::IXMLDOMDocument2Ptr m_pStyleSheet;
MSXML2::IXSLProcessorPtr m_pIXSLProcessor;
};