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" ?>
- <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>
複制代碼
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. 浏覽特定元素
//----檢視所有UserID----
- 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();
- }*/
- /**************這樣也可以**********************
- xml.FindElem(); //UserInfo
- xml.IntoElem();
- while (xml.FindElem("UserID");)
- }
- */
//-------------結果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—
- 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();
- }*/
- /**************這樣也可以**********************
- xml.FindElem(); //UserInfo
- xml.IntoElem();
- while (xml.FindElem("UserID");)
- }
- */
//-------------結果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—
3. 修改
//--------把UserID為”luo”改為”flypigluo”-----------
- BOOL bLoadXml = false;
- 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;
- 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)
//加在最後面
- CMarkup xml;
- bLoadXml = xml.Load("UserInfo.xml");
- xml.AddElem("UserID","luoluo");
- xml.OutOfElem();
- xml.Save("UserInfo.xml");
- }
- //--------原來為------
- <UserInfo>
- </UserInfo>
- //---------添加後為-------------
- <UserID>luoluo</UserID>
- </UserInfo>
4.2 加在最前面(使用InsertElem)
- if (bLoadXml)
- xml.ResetMainPos();
- xml.FindElem();
- xml.IntoElem();
- xml.InsertElem("UserID","AddUserIDHead");
- xml.OutOfElem();
- xml.Save("UserInfo.xml");
- //----原來為—
- //------修改後-----
- <UserID>AddUserIDHead</UserID>
- </UserInfo>
- if (bLoadXml)
- xml.FindElem();
- xml.InsertElem("UserID","AddUserIDHead");
- xml.OutOfElem();
- xml.Save("UserInfo.xml");
- //----原來為—
- <UserInfo>
- <UserID>luo</UserID>
- <UserID>lin</UserID>
- </UserInfo>
- //------修改後-----
- <UserID>AddUserIDHead</UserID>
5. 删除
- 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;
- }
- 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
- <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" />
- //UserInfo1.xml
- <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" />
7. 産生
- CString strID = _T("");
- CString strPwd = _T("");
- xml.SetDoc("xml version=\"1.0\" encoding=\"UTF-8\"?>");
- xml.AddElem("UserInfo");
- 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.Save("UserInfo1.xml");
- CString strID = _T("");
- CString strPwd = _T("");
- xml.SetDoc("xml version=\"1.0\" encoding=\"UTF-8\"?>");
- xml.AddElem("UserInfo");
- 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.Save("UserInfo1.xml");
8. 查找
- BOOL bLoad = false;
- BOOL bFind = false;
- bLoad = xml.Load("UserInfo1.xml");
- if (bLoad)
- CString strID;
- CString strPwd;
- 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;
- TRACE("\n---- find------\n");
- else
- TRACE("\n----no find------\n");
- BOOL bLoad = false;
- BOOL bFind = false;
- bLoad = xml.Load("UserInfo1.xml");
- if (bLoad)
- CString strID;
- CString strPwd;
- 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;
- TRACE("\n---- find------\n");
- else
- TRACE("\n----no find------\n");
9. 修改
- BOOL bLoad = false;
- BOOL bFind = false;
- bLoad = xml.Load("UserInfo1.xml");
- xml.SetChildAttrib("UserID",strID+CString("Modify"));
- xml.Save("UserInfo1.xml");
- }
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 <locale.h>
setlocale(LC_ALL, "");
沒有MBCS宏定義,且打開的檔案是UTF-8編碼:
系統預設将檔案按UTF-8格式讀入系統中,是以顯示的時候要手動将資料轉換為ANSI格式的進行顯示
strVal = CMarkup::UTF8ToA(strVal);
PS:通過strcpy等拷貝函數可以修正。