65.9K
CodeProject 正在变化。 阅读更多。
Home

CXml - MSXML 3.0/4.0/5.0/6.0 的封装类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.99/5 (44投票s)

2007年7月16日

CPOL

2分钟阅读

viewsIcon

3834272

downloadIcon

9612

这个封装类会尝试使用机器上最新的 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")) 

示例代码

请在演示项目中找到示例代码。

JW_CXml/demo.jpg

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
    • CXmlNodeCXmlNodes 添加了另一个复制构造函数
    • 为某些变量添加了 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
© . All rights reserved.