• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 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 閱讀(1680) 評論(0)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            久久强奷乱码老熟女| 久久精品国产一区二区三区日韩| 国产99久久久国产精免费| 久久久精品免费国产四虎| 久久精品国产一区二区三区| 久久久国产99久久国产一| 97精品久久天干天天天按摩| 99久久精品免费| 99精品国产综合久久久久五月天| 精品国产VA久久久久久久冰| 久久亚洲电影| 精品一区二区久久| 国内精品久久久久影院薰衣草| 久久精品国产精品青草app| 久久伊人精品一区二区三区| 久久久91精品国产一区二区三区| 久久久久亚洲AV无码观看| 国产精品99久久不卡| 久久久久人妻一区二区三区vr| 无码乱码观看精品久久| Xx性欧美肥妇精品久久久久久 | 久久综合九色综合久99| 久久天天躁狠狠躁夜夜2020一| 精品无码人妻久久久久久| 国产高潮国产高潮久久久| 久久精品国产色蜜蜜麻豆| 性做久久久久久久久久久| 精品无码人妻久久久久久| 久久综合综合久久狠狠狠97色88| 久久国产精品无码HDAV| 99久久无色码中文字幕人妻| 要久久爱在线免费观看| 亚洲а∨天堂久久精品9966| 久久伊人精品青青草原日本| 久久国产视屏| 亚洲精品综合久久| 一本色综合久久| 精品久久久无码人妻中文字幕| 精品久久亚洲中文无码| 性做久久久久久久| 国产精品久久久久久吹潮|