?經過今天嘗試MFC解析XML串,也算有了不少收獲,總結一下。
?????????我是使用的CMarkup類對XML進行操作。
?????????
?????????CMarkup好象都是先從一個xml文件里面把內容讀出來,再進行解析,搞得我恨不得要把我的CString寫到xml文件里面再取出來了。
?????????如果需要直接讀取CString,可以直接用
???????? CMarkup::SetDoc方法。
?????????最后其他的方法轉載別人的使用例子,寫得很全。
來自http://hi.baidu.com/yxifu/blog/item/fa1569225bda52a44623e8f0.html
(一)?先講一下XML中的物殊字符,手動填寫時注意一下。
字符??????????????????字符實體
&??????????????????????&或&
'??????????????????????'或'
>??????????????????????>或>
<??????????????????????<或&<
"???????????????????????"或"
(二)?CMarkup類的源代碼。
這是目前的最新版本;
這是官網示例文件,取出里面的Markup.cpp和Markup.h,導入你的工程里面,CMarkup類就可以用了;
下載地址:http://www.firstobject.com/Markup83.zip
(三)?創建一個XML文檔。
CMarkup?xml;
xml.AddElem(?"ORDER"?);
xml.AddChildElem(?"ITEM"?);
xml.IntoElem();
xml.AddChildElem(?"SN",?"132487A-J"?);
xml.AddChildElem(?"NAME",?"crank?casing"?);
xml.AddChildElem(?"QTY",?"1"?);
xml.Save("c:\\UserInfo.xml");
效果如下:
<ORDER><ITEM><SN>132487A-J</SN><NAME>crank?casing</NAME><QTY>1</QTY></ITEM></ORDER>
(四)?瀏覽特定元素
CMarkup?xml; xml.Load("UserInfo.xml");
while?(?xml.FindChildElem("ITEM")?) {xml.IntoElem();xml.FindChildElem(?"SN"?);CString?csSN?=?xml.GetChildData();xml.FindChildElem(?"QTY"?);int?nQty?=?atoi(?xml.GetChildData()?);xml.OutOfElem(); }
(五)增加元素和屬性
添加在最后面,使用的是AddElem;添加在最前面,使用InsertElem。
CMarkup?xml;
xml.Load("c:\\UserInfo.xml"); xml.AddElem(?"ORDER"?); xml.IntoElem();?//?進入?ORDER
????xml.AddElem(?"ITEM"?);xml.IntoElem();?//?進入?ITEMxml.AddElem(?"SN",?"4238764-A"?);?//添加元素xml.AddElem(?"NAME",?"bearing"?);//添加元素xml.AddElem(?"QTY",?"15"?);//添加元素xml.OutOfElem();?//?退出?ITEM?
xml.AddElem(?"SHIPMENT"?); xml.IntoElem();?//?進入?SHIPMENT xml.AddElem(?"POC"?);//添加元素 xml.SetAttrib(?"type",?"non-emergency");//添加屬性 xml.IntoElem();?//?進入?POC xml.AddElem(?"NAME",?"John?Smith");//添加元素 xml.AddElem(?"TEL",?"555-1234");//添加元素 xml.Save("c:\\UserInfo.xml");
?
效果如下:
<ORDER><ITEM><SN>132487A-J</SN><NAME>crank?casing</NAME><QTY>1</QTY></ITEM><ITEM><SN>4238764-A</SN><NAME>bearing</NAME><QTY>15</QTY></ITEM><SHIPMENT><POC?type="non-emergency"><NAME>John?Smith</NAME><TEL>555-1234</TEL></POC></SHIPMENT></ORDER>
(六)?修改元素和屬性
如將POC中的屬性type改成:change;
元素TEL改成:123456789
???????CMarkup?xml;
?if?(xml.Load("UserInfo.xml"))
?{
??CString?strUserID?=?_T("");
??xml.ResetMainPos();
??if?(xml.FindChildElem("SHIPMENT"))
??{
???xml.IntoElem();
???if?(xml.FindChildElem("POC"))
???{
????xml.IntoElem();
????CString?str_type=xml.GetAttrib("type");
????MessageBox(str_type);
????xml.SetAttrib("type","change");
????strUserID?=?xml.GetData();
????
????if?(xml.FindChildElem("TEL"))
????{
?????xml.IntoElem();
?????xml.SetData("123456789");
?????xml.Save("UserInfo.xml");
?????return;
????}
???}
??}
?}
(七)刪除元素:
刪除SN=132487A-J的項目。
CMarkup?xml;
?if?(xml.Load("UserInfo.xml"))
?{
??CString?strUserID?=?_T("");
??xml.ResetMainPos();
??if?(xml.FindChildElem("ITEM"))
??{
???xml.IntoElem();
???CString?str_sn;
???xml.FindChildElem("SN");
???str_sn=xml.GetChildData();
???if(str_sn=="132487A-J")
???{
????xml.RemoveElem();
????xml.Save("UserInfo.xml");
???}
??}
?}