随笔 - 32  文章 - 3 评论 - 64 trackbacks - 2
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔档案

文章分类

相册

ASP.NET AJAX

最新评论

阅读排行榜

评论排行榜

         经过今天尝试MFC解析XML串,也算有了不少收获,总结一下。
         我是使用的CMarkup类对XML进行操作。
         
         CMarkup好象都是先从一个xml文件里面把内容读出来,再进行解析,搞得我恨不得要把我的CString写到xml文件里面再取出来了。
         如果需要直接读取CString,可以直接用

         CMarkup::SetDoc方法。
         最后其他的方法转载别人的使用例子,写得很全。
来自http://hi.baidu.com/yxifu/blog/item/fa1569225bda52a44623e8f0.html

(一) 先讲一下XML中的物殊字符,手动填写时注意一下。

字符                  字符实体
&                      &amp;或&
'                      &apos;或'
>                      &gt;或>
<                      &lt;或&<
"                       &quot;或"

(二) 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(); // 进入 ITEM     xml.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");
   }
  }
 }

posted on 2007-04-23 20:41 飞天名猪 阅读(6939) 评论(9)  编辑 收藏 网摘

FeedBack:
#1楼 2007-06-15 00:26 Arinic[未注册用户]
Thanks!

  回复  引用    
您好,我现在正在学习用Cmarkup来遍历Xml,我把那两个文件粘到了我基于对话框的程序中,拖了两个按钮分别执行读和写,在每个按钮的单击事件中声明了Cmarkup的对象,可以点出它的方法,但是却出现错误:这是编译时产生的:
Cannot open include file: 'Markup.h': No such file or directory
有时候编译通过了可是会产生这个错误:
CMarkup' : is not a class or namespace name
请指点一下,谢谢~~

  回复  引用    
居然不能解析utf-16,郁闷死
  回复  引用    
请问CMarkup类和MSXML类哪个比较好用啊?我刚刚开始XML学习
  回复  引用    
#5楼[楼主] 2008-10-14 09:30 飞天名猪      
@上帝的右手
CMarkup只是一个三方的类可以作为代码直接在程序中用,或者是修改,MSXML是微软的一个组件,而且版本有很多种,MSXML3.0,4.0,5.0,6.0,7.0

CMarkup只是一个三方的类可以作为代码直接在程序中用,或者是修改,功能可能不及MSXML那么多和复杂,不过应该能够满足绝大多数的需求,至少我现在遇到的对XML解析和操作的都能解决掉。

MSXML由于版本众多,有一点必须要考虑清楚,你自己机器上可能安装的是MSXML6.0,但是你的用户用的可能是MSXML3.0,有可能会出现程序异常,在部署的时候必须注意。

  回复  引用  查看    
很好
  回复  引用    

@上帝的右手
CMarkup类好用

  回复  引用    
#8楼 2009-04-15 10:46 cpp_crab[未注册用户]
不太明白楼主重载Load有什么意义…
为什么不直接用这个函数呢?
bool SetDoc( const MCD_STR& strDoc );


  回复  引用    
--引用--------------------------------------------------
cpp_crab: 不太明白楼主重载Load有什么意义…
为什么不直接用这个函数呢?
bool SetDoc( const MCD_STR&amp; strDoc );


--------------------------------------------------------
额,当时刚用CMarkup类,对里面的方法还不是很熟悉,现在已经了解了,一直没改过来,我现在改过来吧,误导了大家很长时间。。。

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 724318




相关文章:

相关链接: