//定義智能接口指針
#include<comdef.h>
#include<msxml.h>
_COM_SMARTPTR_TYPEDEF(IXMLDOMDocument,__uuidof(IXMLDOMDocument));
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement,__uuidof(IXMLDOMElement));
_COM_SMARTPTR_TYPEDEF(IXMLDOMNodeList,__uuidof(IXMLDOMNodeList));
_COM_SMARTPTR_TYPEDEF(IXMLDOMNode,__uuidof(IXMLDOMNode));
//IXMLDOMElement 初始化指向根節點;注意相當于數據庫database
//IXMLDOMNodeList 子節點鏈表;注意相當于表table;或者相當于記錄recordset
//IXMLDOMNode 子節點鏈表中指定節點的指針;注意相當于得到表中指定的一條記錄,也可以是單個字段
/*
#import <msxml.dll> named_guids
using namespace MSXML;
替代上面
*/
bool GetxmlData(void)
{
bool loop=false;
//XML文檔指針
HRESULT hr=S_OK;
IXMLDOMDocumentPtr ptrXMLFile=NULL;
hr=ptrXMLFile.CreateInstance(CLSID_DOMDocument);
if(SUCCEEDED(hr)&& ptrXMLFile!=NULL)
{
//得到XML文件的路徑
CStringA path;
m_HttpRequest.GetPhysicalPath(path);
path.Append("Product.xml");
//加載XML文檔
VARIANT_BOOL vbLoaded=VARIANT_FALSE;
ptrXMLFile->put_async(VARIANT_FALSE);
ptrXMLFile->load(_variant_t(path),&vbLoaded);
//成功加載后的處理
if(SUCCEEDED(hr)&& vbLoaded==VARIANT_TRUE)
{
//XML文檔元素指針,初始化指向根節點;注意相當于數據庫database
IXMLDOMElementPtr ptrDocRoot=NULL;
hr=ptrXMLFile->get_documentElement(&ptrDocRoot);
if(SUCCEEDED(hr)&&ptrDocRoot!=NULL)
{
//獲取子節點鏈表;注意相當于表table;或者相當于記錄recordset
IXMLDOMNodeListPtr ptrProductList=NULL;
hr=ptrDocRoot->get_childNodes(&ptrProductList);
if(SUCCEEDED(hr)&& ptrProductList!=NULL)
{
//獲取子節點鏈表中的個數;注意相當于得到記錄的個數
long productNum=0;
hr=ptrProductList->get_length(&productNum);
if(SUCCEEDED(hr)&& productNum)
{
//獲取子節點鏈表中指定節點的指針;注意相當于得到表中指定的一條記錄,
//這里是相當整個字段
IXMLDOMNodePtr ptrProduct=NULL;
static long NodeNum=0;//注意事項記錄號index
hr=ptrProductList->get_item(NodeNum,&ptrProduct);
loop=true;
NodeNum++;
if(NodeNum>productNum)
{ loop=false; }
if(SUCCEEDED(hr)&&ptrProduct!=NULL)
{
//單個字段,及name,這里也就是最小標簽元素
IXMLDOMNodePtr Field=NULL;
_bstr_t bField;
BSTR Text=NULL;
bField="name";
//獲取name元素的內容
hr=ptrProduct->selectSingleNode(bField,&Field);
if(SUCCEEDED(hr)&& Field!=NULL)
{
Field->get_text(&Text);//修改用Field->put_text(&Text);
m_name=Text;
Text=NULL;
Field=NULL;
}
//獲取price1元素的內容
bField="price1";
hr=ptrProduct->selectSingleNode(bField,&Field);
CString S1;
wchar_t * S2;
if(SUCCEEDED(hr)&& Field!=NULL)
{
Field->get_text(&Text);
S1=Text;
S2=S1.GetBuffer(S1.GetLength());
S1.ReleaseBuffer();
m_price[0]=_wtof(S2);
SysFreeString(Text);
Text=NULL;
Field=NULL;
}
//獲取price2元素的內容
bField="price2";
hr=ptrProduct->selectSingleNode(bField,&Field);
if(SUCCEEDED(hr)&& Field!=NULL)
{
Field->get_text(&Text);
S1=Text;
S2=S1.GetBuffer(S1.GetLength());
S1.ReleaseBuffer();
m_price[1]=_wtof(S2);
SysFreeString(Text);
Text=NULL;
Field=NULL;
}
//獲取price3元素的內容
bField="price3";
hr=ptrProduct->selectSingleNode(bField,&Field);
if(SUCCEEDED(hr)&& Field!=NULL)
{
Field->get_text(&Text);
S1=Text;
S2=S1.GetBuffer(S1.GetLength());
S1.ReleaseBuffer();
m_price[2]=_wtof(S2);
SysFreeString(Text);
Text=NULL;
Field=NULL;
}
//獲取price4元素的內容
bField="price4";
hr=ptrProduct->selectSingleNode(bField,&Field);
if(SUCCEEDED(hr)&& Field!=NULL)
{
Field->get_text(&Text);
S1=Text;
S2=S1.GetBuffer(S1.GetLength());
S1.ReleaseBuffer();
m_price[3]=_wtof(S2);
SysFreeString(Text);
Text=NULL;
Field=NULL;
}
//獲取price5元素的內容
bField="price5";
hr=ptrProduct->selectSingleNode(bField,&Field);
if(SUCCEEDED(hr)&& Field!=NULL)
{
Field->get_text(&Text);
S1=Text;
S2=S1.GetBuffer(S1.GetLength());
S1.ReleaseBuffer();
m_price[4]=_wtof(S2);
SysFreeString(Text);
Text=NULL;
Field=NULL;
}
ptrProduct=NULL;
}
}
ptrProductList=NULL;
}
ptrDocRoot=NULL;
}
}
ptrXMLFile=NULL;
}
m_start=true;
return loop;
}