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

昵称:飞天名猪
园龄:5年3个月
粉丝:2
关注:0

搜索

 
 

常用链接

我的标签

随笔档案

文章分类

相册

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 飞天名猪 阅读(14263) 评论(12) 编辑 收藏

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类,对里面的方法还不是很熟悉,现在已经了解了,一直没改过来,我现在改过来吧,误导了大家很长时间。。。

 回复 引用   
好文章。
 回复 引用 查看   
#11楼 2011-03-11 16:03 清清飞扬      
我用你同样的代码,在进行了添加元素后,再调用更新元素时,在Load处就失败了,加载不成功!不知道是哪里的问题?


void CXml_MarkupDlg::OnBtnFind() 
{
	CMarkup xml;
	if(!xml.Load("D:\\Desktop\\dd\\a.xml"))
	{
		MessageBox("加载文件失败,请确认文件是否存在");
		return;
	}
	CString sResult;
	while(xml.FindChildElem("ITEM"))
	{
		xml.IntoElem();							// 进入当前结点
		xml.FindChildElem("SN");
		CString sSN = xml.GetChildData();
		xml.FindChildElem("NAME");
		CString sName = xml.GetChildData();
		xml.FindChildElem("QTY");
		int nQty = atoi(xml.GetChildData());
		xml.OutOfElem();						// 退出当前结点

		sResult.Format("%s, %s, %d", sSN, sName, nQty);
		MessageBox(sResult);
	}
}

void CXml_MarkupDlg::OnBtnAdd() 
{
	CString sFileName = "D:\\Desktop\\dd\\a.xml";
	CMarkup xml;
	if(!xml.Load(sFileName))
	{
		MessageBox("加载文件失败,请确认文件是否存在");
		return;
	}

	xml.AddElem("ORDER");
	xml.IntoElem();
	xml.AddElem("ITEM");
	xml.IntoElem();
	xml.AddElem("SN", "4238764-A");
	xml.AddElem("NAME", "bearing");
	xml.AddElem("QTY", "15");
	xml.OutOfElem();

	xml.AddElem("SHIPMENT");
	xml.IntoElem();
	xml.AddElem("POC");
	xml.SetAttrib("type", "non-emergenty");
	xml.IntoElem();
	xml.AddElem("NAME", "John Smith");
	xml.AddElem("TEL", "555-1234");
	xml.Save(sFileName);
}

void CXml_MarkupDlg::OnBtnUpdate() 
{
	CString sFileName = "D:\\Desktop\\dd\\a.xml";
	CMarkup xml;
	if(!xml.Load(sFileName))
	{
		MessageBox("加载文件失败,请确认文件是否存在");
		return;
	}
	if(xml.FindChildElem("SHIPMENT"))
	{
		xml.IntoElem();
		if(xml.FindChildElem("POC"))
		{
			xml.IntoElem();
			CString sType = xml.GetAttrib("type");
			MessageBox(sType);
			xml.SetAttrib("type", "change");
			CString sUserID = xml.GetData();
			MessageBox(sUserID);
			if(xml.FindChildElem("TEL"))
			{
				xml.IntoElem();
				xml.SetData("123456789");
				xml.Save(sFileName);
			}
		}
	}
}


最初的xml文件内容是:
<ORDER>
<ITEM>
<SN>132487A-J</SN>
<NAME>crank casing</NAME>
<QTY>1</QTY>
</ITEM>
<ITEM>
<SN>132487B-K</SN>
<NAME>crank cafe</NAME>
<QTY>2</QTY>
</ITEM>
</ORDER>

 回复 引用 查看   
#12楼 2011-08-17 09:28 likebeta      
谢谢楼主了,我去试试,用他操作html可以吗?
 回复 引用 查看