VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等。
据说tinyXML很好,可能字符集问题,我编译不了。
所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。
CMarkup下载地址:http://www.firstobject.com/
发现网上有方法很法,我就摘下来了
-
@H_404_14@//----------UserInfo.xml--------------
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserID>luo</UserID> @H_404_14@<UserID>lin</UserID>
- </UserInfo> @H_404_14@//----------UserInfo.xml--------------
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserID>luo</UserID> @H_404_14@<UserID>lin</UserID>
- </UserInfo>
1. 生成UserInfo.xml
-
@H_404_14@CMarkupxml;
- xml.SetDoc("xmlversion=/"1.0/"encoding=/"UTF-8/"?>/r/n"); @H_404_14@xml.AddElem("UserInfo");
- xml.IntoElem(); @H_404_14@xml.AddElem("UserID","luo");
- xml.AddElem("UserID","lin"); @H_404_14@xml.OutOfElem();
- xml.Save("UserInfo.xml"); @H_404_14@CMarkupxml;
- xml.SetDoc("xmlversion=/"1.0/"encoding=/"UTF-8/"?>/r/n"); @H_404_14@xml.AddElem("UserInfo");
- xml.IntoElem(); @H_404_14@xml.AddElem("UserID","lin"); @H_404_14@xml.OutOfElem();
- xml.Save("UserInfo.xml");
2. 浏览特定元素
-
@H_404_14@CMarkupxml;
- xml.Load("UserInfo.xml"); @H_404_14@BOOLbFind=true;
- xml.ResetMainPos(); @H_404_14@while(xml.FindChildElem("UserID");)
- { @H_404_14@@H_732_404@//此时接点还是父接点
- CStringstrTagName=_T(""); @H_404_14@CStringstrData=_T("");
- strTagName=xml.GetChildTagName(); @H_404_14@strData=xml.GetChildData();
- TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData); @H_404_14@}
- @H_732_404@/********************这样也可以****************** @H_404_14@@H_732_404@CMarkupxml;
- @H_732_404@xml.Load("UserInfo.xml"); @H_404_14@@H_732_404@BOOLbFind=true;
- @H_732_404@xml.ResetMainPos(); @H_404_14@@H_732_404@
- @H_732_404@while(xml.FindChildElem("UserID");) @H_404_14@@H_732_404@{
- @H_732_404@xml.IntoElem(); @H_404_14@@H_732_404@CStringstrTagName=_T("");
- @H_732_404@CStringstrData=_T(""); @H_404_14@@H_732_404@strTagName=xml.GetTagName();
- @H_732_404@strData=xml.GetData(); @H_404_14@@H_732_404@TRACE("/n---tagName:%s,Data:%s--/n",strData);
- @H_732_404@xml.OutOfElem(); @H_404_14@@H_732_404@}*/
- @H_732_404@/**************这样也可以********************** @H_404_14@@H_732_404@CMarkupxml;
- @H_732_404@xml.Load("UserInfo.xml"); @H_404_14@@H_732_404@BOOLbFind=true;
- @H_732_404@xml.ResetMainPos(); @H_404_14@@H_732_404@xml.FindElem();//UserInfo
- @H_732_404@xml.IntoElem(); @H_404_14@@H_732_404@while(xml.FindElem("UserID");)
- @H_732_404@{ @H_404_14@@H_732_404@CStringstrTagName=_T("");
- @H_732_404@CStringstrData=_T(""); @H_404_14@@H_732_404@strTagName=xml.GetTagName();
- @H_732_404@strData=xml.GetData(); @H_404_14@@H_732_404@TRACE("/n---tagName:%s,strData);
- @H_732_404@} @H_404_14@@H_732_404@*/
//-------------结果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—
-
@H_404_14@CMarkupxml;
- xml.Load("UserInfo.xml"); @H_404_14@BOOLbFind=true;
- xml.ResetMainPos(); @H_404_14@while(xml.FindChildElem("UserID");)
- { @H_404_14@@H_732_404@//此时接点还是父接点
- CStringstrTagName=_T(""); @H_404_14@CStringstrData=_T("");
- strTagName=xml.GetChildTagName(); @H_404_14@strData=xml.GetChildData();
- TRACE("/n---tagName:%s,Data:lin—
3. 修改
//--------把UserID为”luo”改为”flypigluo”------------
@H_404_14@BOOLbLoadXml=false;
- CMarkupxml; @H_404_14@bLoadXml=xml.Load("UserInfo.xml");
- if(bLoadXml) @H_404_14@{
- CStringstrUserID=_T(""); @H_404_14@xml.ResetMainPos();
- xml.FindElem(); @H_404_14@xml.IntoElem();
- while(xml.FindElem("UserID")) @H_404_14@{
- strUserID=xml.GetData(); @H_404_14@if(strUserID=="luo")
- { @H_404_14@xml.SetData(CString("flypig")+strUserID);
- xml.Save("UserInfo.xml"); @H_404_14@break;
- } @H_404_14@}
- } @H_404_14@@H_732_404@//--------把UserID为”luo”改为”flypigluo”-----------
- BOOLbLoadXml=false; @H_404_14@CMarkupxml;
- bLoadXml=xml.Load("UserInfo.xml"); @H_404_14@if(bLoadXml)
- { @H_404_14@CStringstrUserID=_T("");
- xml.ResetMainPos(); @H_404_14@xml.FindElem();
- xml.IntoElem(); @H_404_14@while(xml.FindElem("UserID"))
- { @H_404_14@strUserID=xml.GetData();
- if(strUserID=="luo") @H_404_14@{
- xml.SetData(CString("flypig")+strUserID); @H_404_14@xml.Save("UserInfo.xml");
- break; @H_404_14@}
- } @H_404_14@}
4. 添加
4.1 添在最后面(使用的是AddElem)
//加在最后面-
@H_404_14@BOOLbLoadXml=false;
- CMarkupxml; @H_404_14@bLoadXml=xml.Load("UserInfo.xml");
- if(bLoadXml) @H_404_14@{
- xml.ResetMainPos(); @H_404_14@xml.FindElem();
- xml.IntoElem(); @H_404_14@xml.AddElem("UserID","luoluo");
- xml.OutOfElem(); @H_404_14@xml.Save("UserInfo.xml");
- } @H_404_14@@H_732_404@//--------原来为------
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserID>luo</UserID> @H_404_14@<UserID>lin</UserID>
- </UserInfo> @H_404_14@@H_732_404@//---------添加后为-------------
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserID>luo</UserID> @H_404_14@<UserID>lin</UserID>
- <UserID>luoluo</UserID> @H_404_14@</UserInfo>
4.2 加在最前面(使用InsertElem)-
@H_404_14@BOOLbLoadXml=false;
- CMarkupxml; @H_404_14@bLoadXml=xml.Load("UserInfo.xml");
- if(bLoadXml) @H_404_14@{
- xml.ResetMainPos(); @H_404_14@xml.FindElem();
- xml.IntoElem(); @H_404_14@xml.InsertElem("UserID","AddUserIDHead");
- xml.OutOfElem(); @H_404_14@xml.Save("UserInfo.xml");
- } @H_404_14@@H_732_404@//----原来为—
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserID>luo</UserID> @H_404_14@<UserID>lin</UserID>
- </UserInfo> @H_404_14@@H_732_404@//------修改后-----
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserID>AddUserIDHead</UserID> @H_404_14@<UserID>luo</UserID>
- <UserID>lin</UserID> @H_404_14@</UserInfo>
- BOOLbLoadXml=false; @H_404_14@CMarkupxml;
- bLoadXml=xml.Load("UserInfo.xml"); @H_404_14@if(bLoadXml)
- { @H_404_14@xml.ResetMainPos();
- xml.FindElem(); @H_404_14@xml.IntoElem();
- xml.InsertElem("UserID","AddUserIDHead"); @H_404_14@xml.OutOfElem();
- xml.Save("UserInfo.xml"); @H_404_14@}
- @H_732_404@//----原来为— @H_404_14@xmlversion="1.0"encoding="UTF-8"?>
- <UserInfo> @H_404_14@<UserID>luo</UserID>
- <UserID>lin</UserID> @H_404_14@</UserInfo>
- @H_732_404@//------修改后----- @H_404_14@xmlversion="1.0"encoding="UTF-8"?>
- <UserInfo> @H_404_14@<UserID>AddUserIDHead</UserID>
- <UserID>luo</UserID> @H_404_14@<UserID>lin</UserID>
- </UserInfo>
5. 删除-
@H_404_14@CMarkupxml;
- xml.Load("UserInfo.xml"); @H_404_14@BOOLbFind=true;
- xml.ResetMainPos(); @H_404_14@while(bFind)
- { @H_404_14@bFind=xml.FindChildElem("UserID");
- if(bFind) @H_404_14@{
- @H_732_404@//此时接点还是父接点 @H_404_14@CStringstrData=_T("");
- strData=xml.GetChildData(); @H_404_14@if(strData=="luo")
- { @H_404_14@xml.RemoveChildElem();
- xml.Save("UserInfo.xml"); @H_404_14@break;
- } @H_404_14@}
- } @H_404_14@CMarkupxml;
- xml.Load("UserInfo.xml"); @H_404_14@BOOLbFind=true;
- xml.ResetMainPos(); @H_404_14@while(bFind)
- { @H_404_14@bFind=xml.FindChildElem("UserID");
- if(bFind) @H_404_14@{
- @H_732_404@//此时接点还是父接点 @H_404_14@CStringstrData=_T("");
- strData=xml.GetChildData(); @H_404_14@if(strData=="luo")
- { @H_404_14@xml.RemoveChildElem();
- xml.Save("UserInfo.xml"); @H_404_14@break;
- } @H_404_14@}
- }
6. 查找
见第二点浏览。类似上面的例子里面没有属性这些东西,下面的一个例子是有属性的-
@H_404_14@@H_732_404@//UserInfo1.xml
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserUserID="UserID00"UserPwd="UserPwd00"UserLevel="158"/> @H_404_14@<UserUserID="UserID01"UserPwd="UserPwd01"UserLevel="162"/>
- <UserUserID="UserID02"UserPwd="UserPwd02"UserLevel="165"/> @H_404_14@<UserUserID="UserID03"UserPwd="UserPwd03"UserLevel="168"/>
- <UserUserID="UserID04"UserPwd="UserPwd04"UserLevel="171"/> @H_404_14@<UserUserID="UserID05"UserPwd="UserPwd05"UserLevel="175"/>
- <UserUserID="UserID06"UserPwd="UserPwd06"UserLevel="178"/> @H_404_14@<UserUserID="UserID07"UserPwd="UserPwd07"UserLevel="181"/>
- <UserUserID="UserID08"UserPwd="UserPwd08"UserLevel="184"/> @H_404_14@<UserUserID="UserID09"UserPwd="UserPwd09"UserLevel="188"/>
- </UserInfo> @H_404_14@@H_732_404@//UserInfo1.xml
- xmlversion="1.0"encoding="UTF-8"?> @H_404_14@<UserInfo>
- <UserUserID="UserID00"UserPwd="UserPwd00"UserLevel="158"/> @H_404_14@<UserUserID="UserID01"UserPwd="UserPwd01"UserLevel="162"/>
- <UserUserID="UserID02"UserPwd="UserPwd02"UserLevel="165"/> @H_404_14@<UserUserID="UserID03"UserPwd="UserPwd03"UserLevel="168"/>
- <UserUserID="UserID04"UserPwd="UserPwd04"UserLevel="171"/> @H_404_14@<UserUserID="UserID05"UserPwd="UserPwd05"UserLevel="175"/>
- <UserUserID="UserID06"UserPwd="UserPwd06"UserLevel="178"/> @H_404_14@<UserUserID="UserID07"UserPwd="UserPwd07"UserLevel="181"/>
- <UserUserID="UserID08"UserPwd="UserPwd08"UserLevel="184"/> @H_404_14@<UserUserID="UserID09"UserPwd="UserPwd09"UserLevel="188"/>
- </UserInfo>
7. 产生
-
@H_404_14@CStringstrID=_T("");
- CStringstrPwd=_T(""); @H_404_14@CMarkupxml;
- xml.SetDoc("xmlversion=/"1.0/"encoding=/"UTF-8/"?>"); @H_404_14@xml.AddElem("UserInfo");
- xml.IntoElem(); @H_404_14@for(inti=0;i<10;i++)
- { @H_404_14@@H_732_404@//产生一个随机数,作为权限
- srand(UINT(time(NULL)+i)); @H_404_14@intnLevel=rand()%256;
- strID.Format("UserID%02d",i); @H_404_14@strPwd.Format("UserPwd%02d",i);
- xml.AddElem("User"); @H_404_14@xml.AddAttrib("UserID",strID);
- xml.AddAttrib("UserPwd",strPwd); @H_404_14@xml.AddAttrib("UserLevel",nLevel);
- } @H_404_14@xml.OutOfElem();
- xml.Save("UserInfo1.xml"); @H_404_14@CStringstrID=_T("");
- CStringstrPwd=_T(""); @H_404_14@CMarkupxml;
- xml.SetDoc("xmlversion=/"1.0/"encoding=/"UTF-8/"?>"); @H_404_14@xml.AddElem("UserInfo");
- xml.IntoElem(); @H_404_14@for(inti=0;i<10;i++)
- { @H_404_14@@H_732_404@//产生一个随机数,作为权限
- srand(UINT(time(NULL)+i)); @H_404_14@intnLevel=rand()%256;
- strID.Format("UserID%02d",nLevel);
- } @H_404_14@xml.OutOfElem();
- xml.Save("UserInfo1.xml");
8. 查找
-
@H_404_14@CMarkupxml;
- BOOLbLoad=false; @H_404_14@BOOLbFind=false;
- bLoad=xml.Load("UserInfo1.xml"); @H_404_14@if(bLoad)
- { @H_404_14@CStringstrID;
- CStringstrPwd; @H_404_14@xml.ResetMainPos();
- xml.FindElem();@H_732_404@//UserInfo @H_404_14@while(xml.FindChildElem("User"))
- { @H_404_14@strID=xml.GetChildAttrib("UserID");
- strPwd=xml.GetChildAttrib("UserPwd"); @H_404_14@TRACE("/n----id:%s,pwd:%s-------/n",strID,strPwd);
- if(strID=="UserID00"&&strPwd=="UserPwd00") @H_404_14@{
- bFind=true; @H_404_14@break;
- } @H_404_14@}
- } @H_404_14@if(bFind)
- { @H_404_14@TRACE("/n----find------/n");
- } @H_404_14@else
- { @H_404_14@TRACE("/n----nofind------/n");
- } @H_404_14@CMarkupxml;
- BOOLbLoad=false; @H_404_14@BOOLbFind=false;
- bLoad=xml.Load("UserInfo1.xml"); @H_404_14@if(bLoad)
- { @H_404_14@CStringstrID;
- CStringstrPwd; @H_404_14@xml.ResetMainPos();
- xml.FindElem();@H_732_404@//UserInfo @H_404_14@while(xml.FindChildElem("User"))
- { @H_404_14@strID=xml.GetChildAttrib("UserID");
- strPwd=xml.GetChildAttrib("UserPwd"); @H_404_14@TRACE("/n----id:%s,strPwd);
- if(strID=="UserID00"&&strPwd=="UserPwd00") @H_404_14@{
- bFind=true; @H_404_14@break;
- } @H_404_14@}
- } @H_404_14@if(bFind)
- { @H_404_14@TRACE("/n----find------/n");
- } @H_404_14@else
- { @H_404_14@TRACE("/n----nofind------/n");
- }
9. 修改
-
@H_404_14@CMarkupxml;
- BOOLbLoad=false; @H_404_14@BOOLbFind=false;
- bLoad=xml.Load("UserInfo1.xml"); @H_404_14@if(bLoad)
- { @H_404_14@CStringstrID;
- CStringstrPwd; @H_404_14@xml.ResetMainPos();
- xml.FindElem();@H_732_404@//UserInfo @H_404_14@while(xml.FindChildElem("User"))
- { @H_404_14@strID=xml.GetChildAttrib("UserID");
- strPwd=xml.GetChildAttrib("UserPwd"); @H_404_14@TRACE("/n----id:%s,strPwd);
- if(strID=="UserID00"&&strPwd=="UserPwd00") @H_404_14@{
- bFind=true; @H_404_14@xml.SetChildAttrib("UserID",strID+CString("Modify"));
- xml.Save("UserInfo1.xml"); @H_404_14@break;
- } @H_404_14@}
- } @H_404_14@if(bFind)
- { @H_404_14@TRACE("/n----find------/n");
- } @H_404_14@else
- { @H_404_14@TRACE("/n----nofind------/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编码格式,所以要在读取的地方设置-
@H_404_14@#include<locale.h>
- setlocale(LC_ALL,"");
没有MBCS宏定义,且打开的文件是UTF-8编码:
系统默认将文件按UTF-8格式读入系统中,所以显示的时候要手动将数据转换为ANSI格式的进行显示
PS:通过strcpy等拷贝函数可以修正