VC中调用MSXML库创建XML

HRESULT InitXmlDOC(MSXML2::IXMLDOMDocumentPtr & pDoc,
                                     MSXML2::IXMLDOMElementPtr & ppRoot)
{
    HRESULT hr;
    hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
    AppendRootW(pDoc, ppRoot, _T("DATA")); //创建DATA 域 <DATA></DATA>

    return E_NOTIMPL;
}

//添加根节点
int AppendRootW(MSXML2::IXMLDOMDocumentPtr & pDoc,
                                  MSXML2::IXMLDOMElementPtr & pRoot,
                                  WCHAR * pRootName)
{
    BSTR bstrBuffer;
    bstrBuffer = SysAllocString(pRootName);
    //创建一个元素
    pDoc->raw_createElement(bstrBuffer, &pRoot);
   
    //把元素添加为节点
    pDoc->raw_appendChild(pRoot, NULL);
 SysFreeString(bstrBuffer);
    return 0;
}


//添加普通节点及值
int AppendElementW(MSXML2::IXMLDOMDocumentPtr & pDoc,
                                     MSXML2::IXMLDOMElementPtr & pRoot,
                                     WCHAR * pNodeName, WCHAR * pNodeValue,
                                     WCHAR * pAttribName, WCHAR * pAttribSize,
                                     WCHAR * pAttribCategory, WCHAR * pAttribDataId, WCHAR * pAttribFileVersion)
{
    BSTR bstrBuffer;
 BSTR nodestr;
    MSXML2::IXMLDOMElementPtr childNode;  //定义临时的节点元素

    // 创建节点
    bstrBuffer = SysAllocString(pNodeName);
    pDoc->raw_createElement(bstrBuffer, &childNode);  //创建一个元素
    SysFreeString(bstrBuffer);

    // 为节点添加属性
    if (pAttribName != NULL)
    {
  nodestr = SysAllocString(_T("n"));
        bstrBuffer = SysAllocString(pAttribName);
        childNode->setAttribute(nodestr,bstrBuffer);

        SysFreeString(bstrBuffer);
  SysFreeString(nodestr);
    }

 // 为节点添加属性-大小
    if (pAttribSize != NULL)
    {
  nodestr = SysAllocString(_T("s"));
        bstrBuffer = SysAllocString(pAttribSize);
        childNode->setAttribute(nodestr, bstrBuffer);

        SysFreeString(bstrBuffer);
  SysFreeString(nodestr);

    }


 // 为节点添加属性-Category
    if (pAttribCategory != NULL)
    {
  nodestr = SysAllocString(_T("c"));
        bstrBuffer = SysAllocString(pAttribCategory);
        childNode->setAttribute(nodestr,bstrBuffer);

        SysFreeString(bstrBuffer);
  SysFreeString(nodestr);
    }


 // 为节点添加属性-数据ID
    if (pAttribDataId != NULL)
    {
  nodestr = SysAllocString(_T("id"));
        bstrBuffer = SysAllocString(pAttribDataId);
        childNode->setAttribute(nodestr,bstrBuffer);

        SysFreeString(bstrBuffer);
  SysFreeString(nodestr);
    }

 // 为节点添加属性-数据版本号
 if (pAttribFileVersion != NULL)
 {
  nodestr = SysAllocString(_T("v"));
  bstrBuffer = SysAllocString(pAttribFileVersion);
  childNode->setAttribute(nodestr,bstrBuffer);

  SysFreeString(bstrBuffer);
  SysFreeString(nodestr);
 }

    // 为节点添加文字
    if (NULL != pNodeValue)
    {
        bstrBuffer = SysAllocString(pNodeValue);
        childNode->Puttext(bstrBuffer);
        SysFreeString(bstrBuffer);
    }

    // 把节点(childNode)加到父节(pRoot->xmlRoot)点下
    pRoot->appendChild(childNode);
    childNode.Release();
    return 0;
}

//从xml data中读出Text,*pXMLStr指向XML字符串并加载,取得节点(*pNodeName)之间的文字(*pText)
int CAuxiliaryExeDlg::GetElementTextW(WCHAR * pXMLStr, WCHAR * pNodeName,
           WCHAR *pXpath, CStringArray * pText)
{
    MSXML2::IXMLDOMDocumentPtr pDoc1;
    MSXML2::IXMLDOMNodePtr pNode1;
    BSTR    bstrBuffer, xpath;
    HRESULT         nRet1, hr;

    //建立xml(xml3.0)文档对象
    hr = pDoc1.CreateInstance(__uuidof(MSXML2::DOMDocument30));

    if (!SUCCEEDED(hr))
    {
#ifdef zzclog
   TRACE(_T("Creat xml object failed!/n"));
  WriteLogFile(_T("Creat xml object failed!/n"));
#endif
        return 1;
    }

    //加载XML字符串
    bstrBuffer = SysAllocString(pXMLStr);
    nRet1 =pDoc1->loadXML(bstrBuffer);
    SysFreeString(bstrBuffer);

    //选择指定节点, 在树中查找名为bstrBuffer的节点,"//"表示在任意一层查找
    bstrBuffer = SysAllocString(pNodeName);
    //得到指定的节点
    pNode1 = (MSXML2::IXMLDOMNodePtr)(pDoc1->selectSingleNode(bstrBuffer));
    SysFreeString(bstrBuffer);

    //取多个文档,xpath
    xpath = SysAllocString(pXpath);  
    MSXML2::IXMLDOMNodeListPtr   pNodeList = pDoc1->selectNodes(xpath);
    SysFreeString(xpath);
    pNodeList->reset();

    bool findflag = false;
    for (int i = 0;i <pNodeList->Getlength() ;i++)
    {
        CString strTemp;
        pNodeList->get_item(i,&pNode1);
  BSTR strRequestType=pNode1->Gettext();
  strTemp = (CString)strRequestType;
        pText->Add(strTemp);
        findflag = true;
  SysFreeString(strRequestType);
    }

    //释放资源
    if (pDoc1 !=NULL)
    {
        pDoc1.Release();
    }
    if (pNode1 != NULL)
    {
        pNode1.Release();
    }

    if (findflag)
    {
        pNodeList.Release();
    }
    return 0;
}

//使用

MSXML2::IXMLDOMElementPtr xmlRoot = NULL;

MSXML2::IXMLDOMDocumentPtr pDoc = NULL;

WCHAR pErrCode[16];

char pReplyBuf[1024];

/* 初始化XML文档对象 */
 InitXmlDOC(pDoc, xmlRoot);

 AppendElementW(pDoc, xmlRoot, L"test", pErrCode, NULL, NULL, NULL,NULL, NULL);

//xml to char

/* 把xml转成BSTR串 */
 pDoc->get_xml(&bstrXML);

 //转成UNICODE
 wcscpy((WCHAR *)pReplyBuf, bstrXML);
 int xmlLen = ::SysStringLen(bstrXML);

/* 释放 */
 pDoc.Release();
 xmlRoot.Release();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值