Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 230, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

WM5.0下如何利用微软的MSXML解析.XML文件

MSXL是Microsoft XML 分析器,是基于COM的,如果是在Windows平台用起来比较方便。WM5.0也有MSXML,不用用法和其他Windows平台下还是有些差异的。
首先要包含头文件“Msxml2.h”,下面是代码:
IXMLDOMDocument *pDoc = NULL;
 IXMLDOMNodeList *pNodelist = NULL;

 IXMLDOMNode *pNode = NULL;
 IXMLDOMElement *pRootElement = NULL;

 if(SUCCEEDED(CoInitializeEx(NULL,COINIT_MULTITHREADED)))//初始化COM组件
 {
  if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,IID_IXMLDOMDocument,(void**)&pDoc)))
  {
   VARIANT vFile;
   vFile.vt = VT_BSTR ;
   VARIANT_BOOL vBool;

   vFile.bstrVal = SysAllocString(FileName);//.XML文件名

   pDoc->load(vFile,&vBool);//加载XML文件
   if(vBool != VARIANT_TRUE)
    return ;
   /////////////////////////
   HRESULT hr; 
   hr = pDoc->get_documentElement(&pRootElement);
   if(SUCCEEDED(hr))
   {
    hr = pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pNode);//获取XML文件的根节点
    if(SUCCEEDED(hr))
    {
     BSTR bsxml;
     //解析XML文件,一层一层的解析
     pNode->hasChildNodes(&vBool);

     if(vBool == VARIANT_TRUE)
     {
      hr = pNode->get_nodeName(&bsxml);

      //获取子节点的个数
      long value;
      pNode->get_childNodes(&pNodelist);
      pNode->Release();
      pNodelist->get_length(&value);

      for(int k = 0; k < value; ++ k)
      {
       BSTR bsxml1;
       pNodelist->get_item(k,&pNode);
       pNode->get_nodeName(&bsxml1);


       IXMLDOMNodeList *pSubNodelist = NULL;

       //获取孙节点的个数
       pNode->get_childNodes(&pSubNodelist);
       pNode->Release();
       long leng;
       pSubNodelist->get_length(&leng);

       if (leng > 0)
       {

        IXMLDOMNode *pSubNode = NULL;

               //解析最下层的节点
        for(int i = 0; i < leng; ++i)
        {

         pSubNodelist->get_item(i,&pSubNode);
         pSubNode->get_nodeName(&bsxml);

  //判断节点的属性,如果是注释属性,则放弃
         DOMNodeType           ntValue;
        pSubNode->get_nodeType((&ntValue);
        if(NODE_COMMENT == ntValue)//也可以判断其他的属性,具体的查看MSDN
             continue;;
        

         //获取节点的属性个数
         IXMLDOMElement* pElement = (IXMLDOMElement*)pSubNode;
         IXMLDOMNamedNodeMap* pMap;
         pElement->get_attributes(&pMap);
         pSubNode->Release();

         long len;
         pMap->get_length(&len);

         //循环读取节点的各个属性(值和名字)
         for(int j = 0; j < len; ++j)
         {
         //如果还有下层的节点,继续循环

          IXMLDOMNode* nameItem;
          VARIANT var;
          pMap->get_item(j,&nameItem);

          //获取属性名
          BSTR NAME;
          nameItem->get_nodeName(&NAME);


          //获取属性值
          nameItem->get_nodeValue(&var);
          LPWSTR VAL = var.bstrVal;

          int a = 9;

         }

        }
        pSubNodelist->Release();
       }
      }
      pNodelist->Release();
     }
     else
      pNode->Release();
    }
   }
   //////////////////////////
   pDoc->Release();
  }
  CoUninitialize();

 }

上面的代码可以用于win32和MFC工程,比较方便。 注意:这个COM的释放比较费时,不可频繁的使用,如果使用比较频繁,可能出现内存泄露。

posted on 2008-11-01 22:27 Benjamin 阅读(1509) 评论(0)  编辑 收藏 引用 所属分类: PDA/PPC开发


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理