在VC中用CMarkup类操纵XML

 首先到http://www.firstobject.com/dn_markup.htm上面下载CMarkup类,将CMarkup.cpp和CMarkup.h导入到我们的工程中就可以了。编译可能会出现问题,解决的方法是在CMarkup.cpp的开头加上#include <stdafx.h>,或者关闭预编译也可以。

1、创建一个XML文档

对于创建一个XML文档,需要实例化一个CMarkup对象,并调用AddElem创建根元素。在这个位置,如果你调用 AddElem("School") ,文档会简单的装一个空元素<School/>然后调用AddChildElem 在根元素的下面创建元素

 1     CMarkup xml;
 2     xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
 3     xml.AddElem("School");
 4     xml.IntoElem();
 5     xml.AddElem("Department","Automation");
 6     xml.AddElem("Department","Computer");
 7     xml.AddElem("Department","Math");
 8     xml.AddElem("Department","English");
 9     xml.OutOfElem();
10     xml.Save("School.xml");


效果如下:

 

1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
2 None.gif < School >
3 None.gif     < Department >Automation </ Department >
4 None.gif     < Department >Computer </ Department >
5 None.gif     < Department >Math </ Department >
6 None.gif     < Department >English </ Department >
7 None.gif </ School >
8 None.gif


2、浏览特定元素

 1     CMarkup xml;
 2     xml.Load("School.xml");
 3     BOOL bFind=TRUE;
 4     xml.ResetMainPos();
 5     
 6     while(xml.FindChildElem("Department"))
 7     {
 8         CString strTagName=_T("");
 9         CString strData=_T("");
10         strTagName=xml.GetChildTagName();    //此时节点是父节点
11         strData=xml.GetChildData();
12         TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);
13     }


//***********************这样也可以*****************************/

 1     CMarkup xml;
 2     xml.Load("School.xml");
 3     BOOL bFind = TRUE;
 4     xml.ResetMainPos();
 5     
 6      while (xml.FindChildElem("Department"))        
 7     {
 8         xml.IntoElem();
 9         CString strTagName = _T("");
10         CString strData = _T("");
11         strTagName = xml.GetTagName();
12         strData = xml.GetData();
13         TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);
14         xml.OutOfElem();
15     }


//***********************或者这样也可以***************************/

 1     CMarkup xml;
 2     xml.Load("School.xml");
 3     BOOL bFind = TRUE;
 4     xml.ResetMainPos();
 5     xml.FindElem();   // School
 6     xml.IntoElem();
 7     
 8      while (xml.FindElem("Department"))
 9     {
10         CString strTagName = _T("");
11         CString strData = _T("");
12         strTagName = xml.GetTagName();
13         strData = xml.GetData();
14         TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);
15     }


//***********结果**************
      ---tagName:Department,Data:Automation--

---tagName:Department,Data:Computer--

---tagName:Department,Data:Math--

---tagName:Department,Data:English--

3、修改元素
//把Department为”English“改为”Chinese“

 1     CMarkup xml;
 2     BOOL bLoadXml=FALSE;
 3     bLoadXml=xml.Load("School.xml");
 4 
 5      if(bLoadXml)
 6     {
 7         CString str=_T("");
 8         xml.ResetMainPos();
 9         xml.FindElem();
10         xml.IntoElem();
11          while(xml.FindElem("Department"))
12         {
13             str=xml.GetData();
14              if(str=="English")
15             {
16                 xml.SetData("Chinese");
17                 xml.Save("School.xml");
18                  break;
19             }
20         }
21     }


效果如下:

1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
2 None.gif < School >
3 None.gif     < Department >Automation </ Department >
4 None.gif     < Department >Computer </ Department >
5 None.gif     < Department >Math </ Department >
6 None.gif     < Department >Chinese </ Department >
7 None.gif </ School >
8 None.gif


4、添加
4、1 添加在最后面(用AddElem)

 1     CMarkup xml;
 2     BOOL bLoadXml=FALSE;
 3     bLoadXml=xml.Load("School.xml");
 4      if(bLoadXml)
 5     {
 6         xml.ResetMainPos();
 7         xml.FindElem();
 8         xml.IntoElem();
 9         xml.AddElem("Department","SiQinghua");
10         xml.OutOfElem();
11         xml.Save("School.xml");
12     }


效果如下:

1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
2 None.gif < School >
3 None.gif     < Department >Automation </ Department >
4 None.gif     < Department >Computer </ Department >
5 None.gif     < Department >Math </ Department >
6 None.gif     < Department >Chinese </ Department >
7 None.gif     < Department >SiQinghua </ Department >
8 None.gif </ School >


4、2 添加在最前面(用InsertElem)

 1     CMarkup xml;
 2     BOOL bLoadXml=FALSE;
 3     bLoadXml=xml.Load("School.xml");
 4      if(bLoadXml)
 5     {
 6         xml.ResetMainPos();
 7         xml.FindElem();
 8         xml.IntoElem();
 9         xml.AddElem("Department","SiQinghua");
10         xml.OutOfElem();
11         xml.Save("School.xml");
12     }


效果如下:

 1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
 2 None.gif < School >
 3 None.gif     < Department >NARI </ Department >
 4 None.gif     < Department >Automation </ Department >
 5 None.gif     < Department >Computer </ Department >
 6 None.gif     < Department >Math </ Department >
 7 None.gif     < Department >Chinese </ Department >
 8 None.gif     < Department >SiQinghua </ Department >
 9 None.gif </ School >
10 None.gif


5、删除

 1     CMarkup xml;
 2     BOOL bLoadXml=FALSE;
 3     bLoadXml=xml.Load("School.xml");
 4      if(bLoadXml)
 5     {
 6         BOOL bFind=TRUE;
 7         xml.ResetMainPos();
 8          while(bFind)
 9         {
10             bFind=xml.FindChildElem("Department");
11              if(bFind)
12             {
13                 CString strData=_T("");
14                 strData=xml.GetChildData();     // 此时节点还是父节点
15                  if("SiQinghua"==strData)
16                 {
17                     xml.RemoveChildElem();
18                     xml.Save("School.xml");
19                      break;
20                 }
21             }
22         }
23     }


效果如下:

1  <? xml version="1.0" encoding="UTF-8" ?>
2  < School >
3      < Department >NARI </ Department >
4      < Department >Automation </ Department >
5      < Department >Computer </ Department >
6      < Department >Math </ Department >
7      < Department >Chinese </ Department >
8  </ School >
9 



上面的例子都是不带属性的,下面举一个带有属性的例子。
1、生成XML文档

 1     CMarkup xml;
 2     xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
 3     xml.AddElem("UserInfo");
 4     xml.IntoElem();
 5      for( int i=0;i<10;i++)
 6     {
 7         CString strID=_T("");
 8         CString strPwd=_T("");
 9 
10         srand(UINT(time(NULL)+i));  // 产生一个随机数
11          int nLevel=rand()%256;
12 
13         strID.Format("UserID%02d",i);
14         strPwd.Format("UserPwd%02d",i);
15 
16         xml.AddElem("User");
17         xml.AddAttrib("UserID",strID);
18         xml.AddAttrib("UserPwd",strPwd);
19         xml.AddAttrib("UserLevel",nLevel);
20     }
21     xml.OutOfElem();
22     xml.Save("UserInfo.xml");


效果如下:

 1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
 2 None.gif < UserInfo >
 3 None.gif     < User  UserID ="UserID00"  UserPwd ="UserPwd00"  UserLevel ="85" />
 4 None.gif     < User  UserID ="UserID01"  UserPwd ="UserPwd01"  UserLevel ="88" />
 5 None.gif     < User  UserID ="UserID02"  UserPwd ="UserPwd02"  UserLevel ="92" />
 6 None.gif     < User  UserID ="UserID03"  UserPwd ="UserPwd03"  UserLevel ="95" />
 7 None.gif     < User  UserID ="UserID04"  UserPwd ="UserPwd04"  UserLevel ="98" />
 8 None.gif     < User  UserID ="UserID05"  UserPwd ="UserPwd05"  UserLevel ="101" />
 9 None.gif     < User  UserID ="UserID06"  UserPwd ="UserPwd06"  UserLevel ="105" />
10 None.gif     < User  UserID ="UserID07"  UserPwd ="UserPwd07"  UserLevel ="108" />
11 None.gif     < User  UserID ="UserID08"  UserPwd ="UserPwd08"  UserLevel ="111" />
12 None.gif     < User  UserID ="UserID09"  UserPwd ="UserPwd09"  UserLevel ="115" />
13 None.gif </ UserInfo >
14 None.gif


2、查找特定属性

 1     CMarkup xml;
 2     BOOL bLoadXml=FALSE;
 3     BOOL bFind=FALSE;
 4     bLoadXml=xml.Load("UserInfo.xml");
 5      if(bLoadXml)
 6     {
 7         CString strID;
 8         CString strPwd;
 9         xml.ResetMainPos();
10         xml.FindElem();     // UserInfo
11          while(xml.FindChildElem("User"))
12         {
13             strID=xml.GetChildAttrib("UserID");
14             strPwd=xml.GetChildAttrib("UserPwd");
15             TRACE("\n---id:%s,pwd:%s---\n",strID,strPwd);
16              if(strID=="UserID02" && strPwd=="UserPwd02")
17             {
18                 bFind=TRUE;
19                  break;
20             }
21         }
22     }
23      if(bFind==TRUE)
24         TRACE("\n---find---\n");
25      else
26         TRACE("\n---not find---\n");


3、修改特定属性

 1     CMarkup xml;
 2     BOOL bFind=FALSE;
 3     BOOL bLoadXml=FALSE;
 4     bLoadXml=xml.Load("UserInfo.xml");
 5      if(bLoadXml)
 6     {
 7         CString strID;
 8         CString strPwd;
 9         xml.ResetMainPos();
10         xml.FindElem();     // UserInfo
11          while(xml.FindChildElem("User"))
12         {
13             strID=xml.GetChildAttrib("UserID");
14             strPwd=xml.GetChildAttrib("UserPwd");
15             TRACE("\n--id:%s,pwd:%s--\n",strID,strPwd);
16              if(strID=="UserID02" && strPwd=="UserPwd02")
17             {
18                 bFind=TRUE;
19                 xml.SetChildAttrib("UserID",strID+CString("Modified"));
20                 xml.Save("UserInfo.xml");
21                  break;
22             }
23         }
24     }
25      if(bFind==TRUE)
26         TRACE("\n---find---\n");
27      else
28         TRACE("\n---not find---\n");


效果如下:

 1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
 2 None.gif < UserInfo >
 3 None.gif     < User  UserID ="UserID00"  UserPwd ="UserPwd00"  UserLevel ="85" />
 4 None.gif     < User  UserID ="UserID01"  UserPwd ="UserPwd01"  UserLevel ="88" />
 5 None.gif     < User  UserID ="UserID02Modified"  UserPwd ="UserPwd02"  UserLevel ="92" />
 6 None.gif     < User  UserID ="UserID03"  UserPwd ="UserPwd03"  UserLevel ="95" />
 7 None.gif     < User  UserID ="UserID04"  UserPwd ="UserPwd04"  UserLevel ="98" />
 8 None.gif     < User  UserID ="UserID05"  UserPwd ="UserPwd05"  UserLevel ="101" />
 9 None.gif     < User  UserID ="UserID06"  UserPwd ="UserPwd06"  UserLevel ="105" />
10 None.gif     < User  UserID ="UserID07"  UserPwd ="UserPwd07"  UserLevel ="108" />
11 None.gif     < User  UserID ="UserID08"  UserPwd ="UserPwd08"  UserLevel ="111" />
12 None.gif     < User  UserID ="UserID09"  UserPwd ="UserPwd09"  UserLevel ="115" />
13 None.gif </ UserInfo >

你可能感兴趣的:(xml,VC,CMarkup)