电竞比分网-中国电竞赛事及体育赛事平台

分享

vc中操作Xml--使用CMarkup類 - VC使用MSXML解析XML文檔 - 深之J...

 素行 2007-05-12

VC使用MSXML解析XML文檔


第一部分:DOM解析:


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



    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é)點:

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

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

        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é)點的內(nèi)容

    _bstr_t strVisiPort=pNode->Gettext();

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

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


   6、設(shè)置一個屬性內(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使用的是加載式的,將會把XML文檔分斷,加載到內(nèi)存中。使用事件通知的方式,來表示找到結(jié)點。好像沒有寫文檔的能力吧。它的速度要比DOM快不少。

       使用SAX的時候,就需要重載MSXML4.0中的一個接口ISAXContentHandler。

      有幾個函數(shù)重載了之后,當找到了結(jié)點之后,就會回調(diào)這一些函數(shù)。
  

對于這一種SAX解析的模式有一些不太了解如何應(yīng)用。只是感覺這種方式可能不太好用于那種

對結(jié)構(gòu)很重要的xml文檔的解析 。

vc中操作Xml--使用CMarkup類

http://www./dn_markup.htm

DotNet中使用xml相對比較輕松,在vc中操作xml,有些繁瑣。最近在網(wǎng)絡(luò)上得知CMarkup比較好用,于是試了下,還好,就把部分例子寫出來。以后有時間的話,再寫清楚點

//----------UserInfo.xml--------------

<?xml version="1.0" encoding="UTF-8" ?>

 <UserInfo>

  <UserID>luo</UserID>

  <UserID>lin</UserID>

  </UserInfo>

 

1。生成UserInfo.xml

CMarkup xml;

xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");

xml.AddElem("UserInfo");

xml.IntoElem();

xml.AddElem("UserID","luo");

xml.AddElem("UserID","lin");

xml.OutOfElem();

xml.Save("UserInfo.xml");

 

2。瀏覽特定元素

//----查看所有UserID----

CMarkup xml;

xml.Load("UserInfo.xml");

BOOL bFind = true;

xml.ResetMainPos();

 

while (xml.FindChildElem("UserID");)

{

       //此時接點還是父接點

         CString strTagName = _T("");

         CString strData = _T("");

         strTagName = xml.GetChildTagName();

         strData = xml.GetChildData();

         TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);

}

       /********************這樣也可以******************

       CMarkup xml;

       xml.Load("UserInfo.xml");

       BOOL bFind = true;

       xml.ResetMainPos();

      

       while (xml.FindChildElem("UserID");)

       {

                     xml.IntoElem();

                     CString strTagName = _T("");

                     CString strData = _T("");

                     strTagName = xml.GetTagName();

                     strData = xml.GetData();

                     TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);

                     xml.OutOfElem();

       }*/

       /**************這樣也可以**********************

       CMarkup xml;

       xml.Load("UserInfo.xml");

       BOOL bFind = true;

       xml.ResetMainPos();

       xml.FindElem();  //UserInfo

       xml.IntoElem();

       while (xml.FindElem("UserID");)

       {

                     CString strTagName = _T("");

                     CString strData = _T("");

                     strTagName = xml.GetTagName();

                     strData = xml.GetData();

                     TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);

       }

       */

 

//-------------結(jié)果----------

---tagName:UserID,Data:luo--

 

---tagName:UserID,Data:lin—

 

3。修改

//--------UserID”luo”改為”flypigluo”-----------

BOOL bLoadXml = false;

CMarkup xml;

bLoadXml = xml.Load("UserInfo.xml");

       if (bLoadXml)

       {

              CString strUserID = _T("");

              xml.ResetMainPos();

              xml.FindElem();

              xml.IntoElem();

              while (xml.FindElem("UserID"))

              {

                     strUserID = xml.GetData();

                     if (strUserID=="luo")

                     {

                            xml.SetData(CString("flypig")+strUserID);

                            xml.Save("UserInfo.xml");

                            break;

                     }

              }

       }

 

 

 

4。添加

4。1   添在最后面(使用的是AddElem

//加在最后面

       BOOL bLoadXml = false;

       CMarkup xml;

       bLoadXml = xml.Load("UserInfo.xml");

       if (bLoadXml)

       {

              xml.ResetMainPos();

              xml.FindElem();

              xml.IntoElem();

              xml.AddElem("UserID","luoluo");

              xml.OutOfElem();

              xml.Save("UserInfo.xml");

       }

//--------原來為------

<?xml version="1.0" encoding="UTF-8" ?>

 <UserInfo>

  <UserID>luo</UserID>

  <UserID>lin</UserID>

  </UserInfo>

//---------添加后為-------------

<?xml version="1.0" encoding="UTF-8" ?>

<UserInfo>

  <UserID>luo</UserID>

  <UserID>lin</UserID>

  <UserID>luoluo</UserID>

  </UserInfo>

4。2  加在最前面(使用InsertElem

BOOL bLoadXml = false;

CMarkup xml;

bLoadXml = xml.Load("UserInfo.xml");

if (bLoadXml)

{

       xml.ResetMainPos();

       xml.FindElem();

       xml.IntoElem();

       xml.InsertElem("UserID","AddUserIDHead");

       xml.OutOfElem();

       xml.Save("UserInfo.xml");

}

//----原來為

<?xml version="1.0" encoding="UTF-8" ?>

 <UserInfo>

  <UserID>luo</UserID>

  <UserID>lin</UserID>

  </UserInfo>

//------修改后-----

<?xml version="1.0" encoding="UTF-8" ?>

<UserInfo>

  <UserID>AddUserIDHead</UserID>

  <UserID>luo</UserID>

  <UserID>lin</UserID>

  </UserInfo>

 

5。刪除

CMarkup xml;

xml.Load("UserInfo.xml");

BOOL bFind = true;

xml.ResetMainPos();      

while (bFind)

{

       bFind = xml.FindChildElem("UserID");

       if (bFind)

       {

              //此時接點還是父接點

              CString strData = _T("");

              strData = xml.GetChildData();

              if (strData=="luo")

              {

                     xml.RemoveChildElem();

                     xml.Save("UserInfo.xml");

                     break;

              }

       }

}

 

 

6。查找

見第二點瀏覽。類似

 

上面的例子里面沒有屬性這些東西,下面的一個例子是有屬性的

//UserInfo1.xml

<?xml version="1.0" encoding="UTF-8" ?>

<UserInfo>

  <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" />

  <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" />

  <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" />

  <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" />

  <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" />

  <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" />

  <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" />

  <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" />

  <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" />

  <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" />

  </UserInfo>

7。產(chǎn)生

CString strID = _T("");

       CString strPwd = _T("");

       CMarkup xml;

       xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

       xml.AddElem("UserInfo");

       xml.IntoElem();

       for (int i=0; i<10; i++)

       {

              //產(chǎn)生一個隨機數(shù),作為權(quán)限

              srand(UINT(time(NULL)+i));

              int nLevel = rand()%256;

              strID.Format("UserID%02d",i);

              strPwd.Format("UserPwd%02d",i);

              xml.AddElem("User");

              xml.AddAttrib("UserID",strID);

              xml.AddAttrib("UserPwd",strPwd);

              xml.AddAttrib("UserLevel",nLevel);

       }

       xml.OutOfElem();

       xml.Save("UserInfo1.xml");

 

8。查找

CMarkup xml;

BOOL bLoad = false;

BOOL bFind = false;

bLoad = xml.Load("UserInfo1.xml");

       if (bLoad)

       {

              CString strID;

              CString strPwd;

              xml.ResetMainPos();

              xml.FindElem();    //UserInfo

              while (xml.FindChildElem("User"))

              {

                     strID = xml.GetChildAttrib("UserID");

                     strPwd = xml.GetChildAttrib("UserPwd");

                     TRACE("\n----id:%s,pwd:%s-------\n",strID,strPwd);

                     if (strID=="UserID00"&&strPwd=="UserPwd00")

                     {

                            bFind = true;

                            break;

                     }

              }

       }

       if (bFind)

       {

              TRACE("\n---- find------\n");

       }

       else

       {

              TRACE("\n----no find------\n");

       }

 

9。修改

CMarkup xml;

       BOOL bLoad = false;

       BOOL bFind = false;

       bLoad = xml.Load("UserInfo1.xml");

       if (bLoad)

       {

              CString strID;

              CString strPwd;

              xml.ResetMainPos();

              xml.FindElem();    //UserInfo

              while (xml.FindChildElem("User"))

              {

                     strID = xml.GetChildAttrib("UserID");

                     strPwd = xml.GetChildAttrib("UserPwd");

                     TRACE("\n----id:%s,pwd:%s-------\n",strID,strPwd);

                     if (strID=="UserID00"&&strPwd=="UserPwd00")

                     {

                            bFind = true;

                            xml.SetChildAttrib("UserID",strID+CString("Modify"));

                            xml.Save("UserInfo1.xml");

                            break;

                     }

              }

       }

       if (bFind)

       {

              TRACE("\n---- find------\n");

       }

       else

       {

              TRACE("\n----no find------\n");

       }



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=666688

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多