MSXML的DOM遍历

xml文件如下:

<?xml version="1.0" encoding="GBK" ?>
<response>
  <size>3</size>
<message>
  <telephone>13800138000</telephone>
  <content>trunk zhongluo-cnc average duration to low!</content>
  <time>2006-11-14 14:07:35.221121</time>
  </message>
<message>
  <telephone>13800138000</telephone>
  <content>trunk zhongluo-cnc average duration to low!</content>
  <time>2006-11-14 14:04:43.268822</time>
  </message>
<message>
  <telephone>13800138000</telephone>
  <content>trunk zhongluo-cnc average duration to low!</content>
  <time>2006-11-14 12:18:26.304131</time>
  </message>
</response>

 

其中size字段是指明一共有多少条message,其实这个字段是多余的
本例子是读入字符串来处理的

 


try
{
 HRESULT hr;
 IXMLDOMDocument* pXMLDoc;
 IXMLDOMNode* pXDN;

 IXMLDOMNodeList* pIDOMNodeList = NULL;
 IXMLDOMElement* xmlRoot = NULL;

 BSTR bstrItemText;

// long value;


 i=0;
 //COM的初始化

 hr=CoInitialize(NULL);

 //得到关于IXMLDOMDocument接口的指针pXMLDOC
 hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,
  IID_IXMLDOMDocument,(void**) &pXMLDoc);
 //将XML字符串转换成UNICODE,然后加载
 VARIANT_BOOL bSuccess = false;
 //pXMLDoc->loadXML(L"<?xml version=/"1.0/" encoding=/"GBK/"?><response><size>3</size><message><telephone>13560426958</telephone><content>trunk zhongluo-cnc average duration to low!</content><time>2006-11-14 12:18:26.304131</time></message><message><telephone>13560426958</telephone><content>trunk zhongluo-cnc average duration to low!</content><time>2006-11-14 14:07:35.221121</time></message><message><telephone>13560426958</telephone><content>trunk zhongluo-cnc average duration to low!</content><time>2006-11-14 01:09:53.959187</time></message></response>",&bSuccess);
pXMLDoc->loadXML(p,&bSuccess);
 //得到已加载的XML字符串,并显示
 LPWCH tempxml;

 pXMLDoc->get_documentElement(&xmlRoot);//根目录
 xmlRoot->get_childNodes(&pIDOMNodeList);//下一层的列表
// if(pIDOMNodeList)
// {MessageBox("成功","pIDOMNodeList",MB_OK);}
// hr = pIDOMNodeList->get_length(&value); //得到所包含的NODE节点的个数


 //因为此处是输出参数[out][retval],所以不用new一段空间
/*
 pXMLDoc->get_xml(&tempxml);
 MessageBoxW(NULL,tempxml,L"XML正文",MB_OK);
*/
 //取到<time>,<title>以及<content>节点,并显示结点内容
 pXMLDoc->selectSingleNode(L"//size",(IXMLDOMNode **)&pXDN);
 pXDN->get_text(&tempxml);
// MessageBoxW(NULL,tempxml,L"size值",MB_OK);

 i=_wtoi(tempxml);
 if(0==i)
  return;

/*
 pXMLDoc->selectSingleNode(L"//message",(IXMLDOMNode **)&pXDN);
 pXDN->get_text(&tempxml);
 MessageBoxW(NULL,tempxml,L"message值",MB_OK);
*/

// pIDOMNodeList->get_item(1,(IXMLDOMNode **)&pXDN);

 int j=1;
 while(!pIDOMNodeList->get_item(j,(IXMLDOMNode **)&pXDN))
 {
//  pXDN->get_text(&bstrItemText); //得到该节点相关的文本信息
//  ::MessageBoxW(NULL, bstrItemText,L"内容", MB_OK);

  IXMLDOMNodeList* pChildNodeList = NULL;
  IXMLDOMNode* pChildNode;
  pXDN->get_childNodes(&pChildNodeList);

 

   pChildNodeList->get_item(0,(IXMLDOMNode **)&pChildNode);
   pChildNode->get_text(&bstrItemText);
   ::MessageBoxW(NULL, bstrItemText,L"telephone", MB_OK);
   pChildNode->Release();
   pChildNode = NULL;

   pChildNodeList->get_item(1,(IXMLDOMNode **)&pChildNode);
   pChildNode->get_text(&bstrItemText);
   ::MessageBoxW(NULL, bstrItemText,L"content", MB_OK);
   pChildNode->Release();
   pChildNode = NULL;

   pChildNodeList->get_item(2,(IXMLDOMNode **)&pChildNode);
   pChildNode->get_text(&bstrItemText);
   ::MessageBoxW(NULL, bstrItemText,L"time", MB_OK);
   pChildNode->Release();
   pChildNode = NULL;


  pXDN->Release();
  pXDN = NULL;

  j++;

 }
    

/*    
 int j=1;
 while(j<i)
 {
  pXMLDoc->selectSingleNode(L"//telephone",(IXMLDOMNode **)&pXDN);
  pXDN->get_text(&tempxml);
  MessageBoxW(NULL,tempxml,L"telephone",MB_OK);

  pXMLDoc->selectSingleNode(L"//content",(IXMLDOMNode **)&pXDN);
  pXDN->get_text(&tempxml);
  MessageBoxW(NULL,tempxml,L"content",MB_OK);

  pXMLDoc->selectSingleNode(L"//time",(IXMLDOMNode **)&pXDN);
  pXDN->get_text(&tempxml);
  MessageBoxW(NULL,tempxml,L"time",MB_OK);

  pXDN->get_text(&bstrItemText); //得到该节点相关的文本信息
  ::MessageBoxW(NULL, bstrItemText,L"内容", MB_OK);

  pXDN->Release();
  pXDN = NULL;
//  pIDOMNodeList->nextNode((IXMLDOMNode **)&pXDN);
//  ((IXMLDOMNode **)&pXDN)++;
  j++;
  pIDOMNodeList->get_item(2,(IXMLDOMNode **)&pXDN);
 }
*/
 //释放分配的资源
 CoUninitialize();
}//try........
catch(...)
{
 AfxMessageBox("错误!");

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值