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