VC轻松解析XML文件 - CMarkup类的使用方法

VC轻松解析XML文件 - CMarkup类的使用方法
http://www.cctry.com/thread-3866-1-1.html

VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等。
据说tinyXML很好,可能字符集问题,我编译不了。
所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。
CMarkup下载地址:http://www.firstobject.com/
发现网上有方法很法,我就摘下来了

//----------UserInfo.xml--------------
xml version="1.0" encoding="UTF-8" ?>

luo
lin

//----------UserInfo.xml--------------
xml version="1.0" encoding="UTF-8" ?>

luo
lin

复制代码

  1. 生成UserInfo.xml

CMarkup xml;
xml.SetDoc("xml version="1.0" encoding="UTF-8"?>rn");
xml.AddElem("UserInfo");
xml.IntoElem();
xml.AddElem("UserID","luo");
xml.AddElem("UserID","lin");
xml.OutOfElem();
xml.Save("UserInfo.xml");
CMarkup xml;
xml.SetDoc("xml version="1.0" encoding="UTF-8"?>rn");
xml.AddElem("UserInfo");
xml.IntoElem();
xml.AddElem("UserID","luo");
xml.AddElem("UserID","lin");
xml.OutOfElem();
xml.Save("UserInfo.xml");
复制代码

  1. 浏览特定元素
    //----查看所有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);    
  }    
  */     

复制代码
//-------------结果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—

//----查看所有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); 
  } 
  */

复制代码
//-------------结果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—

  1. 修改

//--------把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;     
                }     
          }     
  }    

//--------把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; 
                } 
          } 
  }

复制代码

  1. 添加

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" ?>

luo
lin

//---------添加后为-------------
xml version="1.0" encoding="UTF-8" ?>

luo
lin
luoluo

复制代码
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" ?>

luo
lin

//------修改后-----
xml version="1.0" encoding="UTF-8" ?>

AddUserIDHead
luo
lin

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" ?>

luo
lin

//------修改后-----
xml version="1.0" encoding="UTF-8" ?>

AddUserIDHead
luo
lin

复制代码

  1. 删除

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;     
          }     
  }     

}
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; 
          } 
  } 

}
复制代码

  1. 查找
    见第二点浏览。类似上面的例子里面没有属性这些东西,下面的一个例子是有属性的

//UserInfo1.xml
xml version="1.0" encoding="UTF-8" ?>












//UserInfo1.xml
xml version="1.0" encoding="UTF-8" ?>












复制代码

  1. 产生

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++)     
  {     
          //产生一个随机数,作为权限     
          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");    

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++) 
  { 
          //产生一个随机数,作为权限 
          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");

复制代码

  1. 查找

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");     
  }    

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"); 
  }

复制代码

  1. 修改

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");     
  }   

复制代码
CMarkup字符集问题
daubwu posted @ 2008年9月08日 00:54 in VC with tags XML CMarkup , 38 阅读
CMarkup支持Unicode,_MBCS宏定义。VS默认设置为MBCS宏定义,未设置该宏时为UTF-8编码。
有 MBCS宏定义,且 打开的文件是UTF-8编码:
CMarkup在Load时将UTF-8转换ANSI编码格式,所以要在读取的地方设置

include

setlocale(LC_ALL, "");
没有MBCS宏定义,且打开的文件是UTF-8编码:
系统默认将文件按UTF-8格式读入系统中,所以显示的时候要手动将数据转换为ANSI格式的进行显示

include

setlocale(LC_ALL, "");
strVal = CMarkup::UTF8ToA(strVal);
PS:通过strcpy等拷贝函数可以修正。

上一篇:svn利用钩子脚本功能实现代码同步到web目录


下一篇:WebGIS中一些功能算法实例