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