C++下基于COM的XML格式字符串解析,生成

C++下基于COM的XML格式字符串解析,生成

现在,XML格式字符串广泛应用于各种信息的交互。不论你是做网络开发,还是桌面应用程序开发,甚至是游戏开发,都会不可避免的碰到XML格式的字符串,今天这篇文章来介绍一下在C++语言下,基于COMXML字符串的解析与生成。

首先这里要明确两个基本概念,一个是COM,一个是XML格式。

先来说COMCOM的全称是Component Object model,组件对象模型,OMGObjectManagementGroup)为了实现把复杂的应用程序分割成一个个功能单一,规模较小的组件,来越来越复杂化的程序功能,发布了CORBA(CommonObject Request Breaker Architecture)标准,这个标准在unix下执行,而在windows下,这套标准就是COM。详细的说明可以在我的另一篇博文:http://blog.csdn.net/crich_moon/article/details/6614392中找到。

再来简单介绍一下XMLXMLExtensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)XmlInternet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

接下来先看一下如何用COM组件实现对XML格式字符串的解析。

首先需要包含头文件

#include<windows.h>
#include <msxml.h>

然后在头文件中定义类,声明类的成员函数:

class XmlHelper
{
public:
    XmlHelper(void);
    XmlHelper(LPCTSTR XmlFileName);
    ~XmlHelper(void);

   HRESULT ReadItemValue(LPCTSTR strItem,LPCTSTR strValueName,TCHAR*pchValue,DWORD dwCount);
    HRESULT ReadItemAttributeValue(LPCTSTR strItem,LPCTSTRstrValueName,LPCTSTR strAttributeName,TCHAR* strAttributeValue,DWORD dwCount);
    HRESULT WriteItemValue(LPCTSTR strRootName,LPCTSTR strItem,LPCTSTRstrValueName,LPCTSTR strValue,LPCTSTR strAttributeName,LPCTSTRstrAttributeValue);
private:
    BSTR m_szXmlFile;
    BSTR m_szXmlStr;
    int m_nXmlLen;
};

然后在CPP文件中定义成员函数的实现:

XmlHelper::XmlHelper(LPCTSTRXmlFileName)
{
    if (!XmlFileName)
    {
        ASSERT(0);
    }
    else
    {
        m_szXmlFile =SysAllocString(XmlFileName);
    }
}
HRESULT XmlHelper::ReadItemValue(LPCTSTR strItem,LPCTSTR strValueName,TCHAR*pchValue,DWORD dwCount)
{
    HRESULT hr = E_FAIL;
    BSTR pText = NULL;

    IXMLDOMDocument* piXMLDoc = NULL;
    IXMLDOMElement* pRoot = NULL;

   CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(LPVOID*)&piXMLDoc);

    if (piXMLDoc)
    {
       piXMLDoc->put_async(VARIANT_FALSE);

        VARIANT vXmlFile;
        vXmlFile.vt = VT_BSTR;
        vXmlFile.bstrVal =(BSTR)m_szXmlFile;

        VARIANT_BOOL    vb;
        piXMLDoc->load(vXmlFile,&vb);
        if (vb)
        {
           piXMLDoc->get_documentElement(&pRoot);

            if (pRoot)
            {
               IXMLDOMNode* pMainNode = NULL;
               IXMLDOMElement* pMainNodeEle = NULL;

               pRoot->selectSingleNode((BSTR)strItem,&pMainNode);
               if (pMainNode)
               {
                   pMainNode->QueryInterface(IID_IXMLDOMElement,(VOID**)&pMainNodeEle);
                   pMainNode->Release();
               }

               if (pMainNodeEle)
               {

                   IXMLDOMNode* pValueNode = NULL;
                   IXMLDOMElement* pValueNodeEle = NULL;

                   pMainNodeEle->selectSingleNode((BSTR)strValueName,&pValueNode);
                   if (pValueNode)
                   {
                       pValueNode->QueryInterface(IID_IXMLDOMElement,(VOID**)&pValueNodeEle);
                       pValueNode->Release();
                   }
                   if (pValueNodeEle)
                   {
                       hr = pValueNodeEle->get_text(&pText);
                       pValueNodeEle->Release();
                   }
                   pMainNodeEle->Release();
               }
               pRoot->Release();
           }        
        }

        piXMLDoc->Release();
    }

    if (pText)
    {
        wcsncpy(pchValue,pText,dwCount);
        SysFreeString(pText);
    }
    return hr;

}

HRESULT XmlHelper::ReadItemAttributeValue(LPCTSTR strItem,LPCTSTRstrValueName,LPCTSTR strAttributeName,TCHAR* strAttributeValue,DWORD dwCount)
{
    WaitForSingleObject(m_hSyncEvent,5000);
    HRESULT hr = E_FAIL;
    VARIANT vattri={0};


    IXMLDOMDocument* piXMLDoc = NULL;
    IXMLDOMElement* pRoot = NULL;

   CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(LPVOID*)&piXMLDoc);

    if (piXMLDoc)
    {
        piXMLDoc->put_async(VARIANT_FALSE);

        VARIANT vXmlFile;
        vXmlFile.vt = VT_BSTR;
        vXmlFile.bstrVal =(BSTR)m_szXmlFile;

        VARIANT_BOOL    vb;
        piXMLDoc->load(vXmlFile,&vb);
        if (vb)
        {
           piXMLDoc->get_documentElement(&pRoot);

            if (pRoot)
            {
               IXMLDOMNode* pMainNode = NULL;
               IXMLDOMElement* pMainNodeEle = NULL;

               pRoot->selectSingleNode((BSTR)strItem,&pMainNode);
               if (pMainNode)
               {
                   pMainNode->QueryInterface(IID_IXMLDOMElement,(VOID**)&pMainNodeEle);
                   pMainNode->Release();
               }

               if (pMainNodeEle)
               {

                   IXMLDOMNode* pValueNode = NULL;
                   IXMLDOMElement* pValueNodeEle = NULL;

                   pMainNodeEle->selectSingleNode((BSTR)strValueName,&pValueNode);
                   if (pValueNode)
                   {
                       pValueNode->QueryInterface(IID_IXMLDOMElement,(VOID**)&pValueNodeEle);
                       pValueNode->Release();
                   }
                   if (pValueNodeEle)
                   {
                       //hr = pValueNodeEle->get_text(&pText);

                       BSTR bstrattr = SysAllocString(strAttributeName);
                       hr = pValueNodeEle->getAttribute(bstrattr,&vattri);
                       SysFreeString(bstrattr);

                       pValueNodeEle->Release();
                   }
                   pMainNodeEle->Release();
               }
               pRoot->Release();
           }        
        }

        piXMLDoc->Release();
    }

    if (vattri.vt == VT_BSTR && vattri.bstrVal)
    {
        wcsncpy(strAttributeValue,vattri.bstrVal,dwCount);
        SysFreeString(vattri.bstrVal);
    }

    SetEvent(m_hSyncEvent);
    return hr;
}

HRESULT XmlHelper::WriteItemValue(LPCTSTR strRootName,LPCTSTR strItem,LPCTSTRstrValueName,LPCTSTR strValue,LPCTSTR strAttributeName,LPCTSTRstrAttributeValue)
{
    WaitForSingleObject(m_hSyncEvent,5000);
    HRESULT hr = E_FAIL;
    IXMLDOMDocument* piXMLDoc = NULL;
    IXMLDOMElement* pRoot = NULL;

   CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(LPVOID*)&piXMLDoc);

    if (piXMLDoc)
    {
       piXMLDoc->put_async(VARIANT_FALSE);

        VARIANT vXmlFile;
        vXmlFile.vt = VT_BSTR;
        vXmlFile.bstrVal =(BSTR)m_szXmlFile;

        VARIANT_BOOL    vb;
        piXMLDoc->load(vXmlFile,&vb);
        if (!vb)
        {
           piXMLDoc->createElement((BSTR)strRootName,&pRoot);
            if (pRoot)
            {
               piXMLDoc->appendChild(pRoot,NULL);
            }
        }

        if (!pRoot)
        {
           piXMLDoc->get_documentElement(&pRoot);
        }
        if (pRoot)
        {

            IXMLDOMNode*pMainNode = NULL;
           IXMLDOMElement* pMainNodeEle = NULL;

           pRoot->selectSingleNode((BSTR)strItem,&pMainNode);
            if (!pMainNode)
            {
               piXMLDoc->createElement((BSTR)strItem,&pMainNodeEle);
               pRoot->appendChild(pMainNodeEle,NULL);
            }
            else
            {
               pMainNode->QueryInterface(IID_IXMLDOMElement,(VOID**)&pMainNodeEle);
               pMainNode->Release();
            }

            if(pMainNodeEle)
            {

               IXMLDOMNode* pValueNode = NULL;
               IXMLDOMElement* pValueNodeEle = NULL;

               pMainNodeEle->selectSingleNode((BSTR)strValueName,&pValueNode);
               if (!pValueNode)
               {
                   piXMLDoc->createElement((BSTR)strValueName,&pValueNodeEle);
                   pMainNodeEle->appendChild(pValueNodeEle,NULL);
               }
               else
               {
                   pValueNode->QueryInterface(IID_IXMLDOMElement,(VOID**)&pValueNodeEle);
                   pValueNode->Release();
               }
               if (pValueNodeEle)
               {
                   VARIANT vut;
                   vut.vt = VT_BSTR;
                   vut.bstrVal = SysAllocString(strAttributeValue);

                   pValueNodeEle->setAttribute((BSTR)strAttributeName,vut);

                   SysFreeString(vut.bstrVal);


                   BSTR bstrValue = SysAllocString(strValue);
                   hr = pValueNodeEle->put_text(bstrValue);
                   SysFreeString(bstrValue);
                   pValueNodeEle->Release();
               }
               pMainNodeEle->Release();
            }
           pRoot->Release();
        }

        piXMLDoc->save(vXmlFile);
        piXMLDoc->Release();
    }

    SetEvent(m_hSyncEvent);
    return hr;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值