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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章