标签:
本篇文章是对VC解析XML文件-CMarkup的使用进行了详细的分析介绍,需要的朋友参考下
VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等。
据说tinyXML很好,可能字符集问题,我编译不了。
所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。
CMarkup下载地址:http://www.firstobject.com/
发现网上有方法很法,我就摘下来了
复制代码 代码如下:
//----------UserInfo.xml--------------    
xml version="1.0" encoding="UTF-8"
?>     
<UserInfo>    
  <UserID>luo</UserID>     
  <UserID>lin</UserID>     
  </UserInfo>   
//----------UserInfo.xml--------------
xml version="1.0" encoding="UTF-8" ?> 
<UserInfo>
<UserID>luo</UserID> 
<UserID>lin</UserID> 
</UserInfo>
一、生成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");    
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");
二、浏览特定元素
复制代码 代码如下:
//----查看所有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—
三、修改
复制代码 代码如下:
//--------把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  添在最后面(使用的是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>
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>    
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>
五、删除
复制代码 代码如下:
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; 
             
} 
      } 
}
六、查找
见第二点浏览。类似上面的例子里面没有属性这些东西,下面的一个例子是有属性的
复制代码 代码如下:
//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>    
//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>
七、产生
复制代码 代码如下:
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");
八、查找
复制代码 代码如下:
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"); 
      }
九、修改
复制代码 代码如下:
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字符集问题
CMarkup支持Unicode,_MBCS宏定义。VS默认设置为MBCS宏定义,未设置该宏时为UTF-8编码。
有 MBCS宏定义,且 打开的文件是UTF-8编码:
CMarkup在Load时将UTF-8转换ANSI编码格式,所以要在读取的地方设置
#include <locale.h>
setlocale(LC_ALL, "");
没有MBCS宏定义,且打开的文件是UTF-8编码:
系统默认将文件按UTF-8格式读入系统中,所以显示的时候要手动将数据转换为ANSI格式的进行显示
#include <locale.h>
setlocale(LC_ALL, "");
strVal = CMarkup::UTF8ToA(strVal);
PS:通过strcpy等拷贝函数可以修正。
标签:
原文地址:http://www.cnblogs.com/skyofbitbit/p/4769243.html