我把以前寫過(guò)的一個(gè)例子帖出來(lái),以備以后使用.


第一部分:DOM解析:


      概述:DOM解析將會(huì)把一個(gè)完整的XML文檔讀進(jìn)來(lái),生成一個(gè)結(jié)構(gòu)樹。這樣會(huì)要把XML文檔全部都加載到內(nèi)在中。所以解析起來(lái)的速度會(huì)要慢一些。



    1、如何加載xml文件:

         //創(chuàng)建DOM,加載XML文檔
         MSXML::IXMLDOMDocumentPtr pCommandDoc;
         pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
          pCommandDoc->put_async(VARIANT_FALSE);
          pCommandDoc->put_validateOnParse(VARIANT_FALSE);
          pCommandDoc->put_resolveExternals(VARIANT_FALSE);
          pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
          pCommandDoc->load(file.GetBuffer(0));

     2、在XML文檔中查找指定的結(jié)點(diǎn):

      //找到
     MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");
       if (pRootNode==NULL)
     {
          return ;
      }

    3、得到XML文檔中,結(jié)點(diǎn)的屬性

        CString strTemp;
     MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
     pRootNode->get_attributes(&pAttrs);
     if (pAttrs==NULL)
     {
          return;
     }
     MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");
     _bstr_t strRequestType=pRequestTypeAttr->Gettext();
     strTemp=strRequestType.operator char *();

    4、得到結(jié)點(diǎn)的內(nèi)容

    _bstr_t strVisiPort=pNode->Gettext();

    5、設(shè)置結(jié)點(diǎn)的內(nèi)容

     HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));


   6、設(shè)置一個(gè)屬性內(nèi)容
    IXMLDOMAttribute *pa=NULL;
    bstr = SysAllocString(L"屬性1");
    pXMLDom->createAttribute(bstr,&pNode);
    var = VariantString(L"strin");
    pa->put_value(var);
    pRoot->setAttributeNode(pa, &pa1);
   

第二部分、如何使用SAX解析

        概述:SAX使用的是加載式的,將會(huì)把XML文檔分?jǐn)啵虞d到內(nèi)存中。使用事件通知的方式,來(lái)表示找到結(jié)點(diǎn)。好像沒(méi)有寫文檔的能力吧。它的速度要比DOM快不少。

       使用SAX的時(shí)候,就需要重載MSXML4.0中的一個(gè)接口ISAXContentHandler。

      有幾個(gè)函數(shù)重載了之后,當(dāng)找到了結(jié)點(diǎn)之后,就會(huì)回調(diào)這一些函數(shù)。