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

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" ?> 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/"?>/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");

2. 浏览特定元素

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—   

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—

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

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; } } } 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" ?> //UserInfo1.xml xml version="1.0" encoding="UTF-8" ?>

7. 产生


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

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

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等拷贝函数可以修正。

你可能感兴趣的:(C/C++)