MSXML 版本管理与 XML 操作类库

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; };
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485