现在的位置: 首页 > 综合 > 正文

在VC中调用MSXML库创建XML

2019年11月24日 ⁄ 综合 ⁄ 共 4622字 ⁄ 字号 评论关闭

//初始化 xml文档,添加根节点<DATA>
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();

 

程序发布的时候要把动态库也要发布.使用开源的XML库也是一个很好的选择.

【上篇】
【下篇】

抱歉!评论已关闭.