CMarkup类操作Xml总结

 

一、下载Markup.cpp 和 Markup.h

下载地址:http://www.firstobject.com/dn_markup.htm 解压缩

二、将此两个文件放置于工程目录下

三、在需要用到CMarkup的地方 #include "Markup.h"

当然VC中还需要配置一下环境

在VC6.0下:

a.在Markup.cpp的顶端加上#include"stdafx.h" 或者

b.关闭Markup.cpp的预编译头设置,具体方法如下:

  Project->Setting  弹出ProjectSetting对话框,在左边的文件树下选择Markup.cpp,然后在"Settings for"下拉框下选择 "All Configurations",选择 C/C++标签页,

接着在Category下拉框下选中 "Precompiled Headers"选项,选中下面的"Not Using Precompiled Headers." 单选按钮即可


CMarkup的基本使用:

例如要读取如下UserInfos.xml的内容

  1.   <?xmlversion="1.0"encoding="UTF-8"?>  
  2. - <UserInfos> 
  3. - <UserInfo> 
  4.   <name>WangYao</name>  
  5.   <age>25</age>  
  6.   </UserInfo> 
  7. - <UserInfo> 
  8.   <name>Hisin</name>  
  9.   <age>27</age>  
  10.   </UserInfo> 
  11.   </UserInfos> 
  <?xml version="1.0" encoding="UTF-8" ?> 
- <UserInfos>
- <UserInfo>
  <name>WangYao</name> 
  <age>25</age> 
  </UserInfo>
- <UserInfo>
  <name>Hisin</name> 
  <age>27</age> 
  </UserInfo>
  </UserInfos>

源代码如下:

  1.     CMarkup xml; 
  2. bool    flag; 
  3.  
  4. //加载Xml文件 
  5. flag = xml.Load("d:\\UserInfos.xml"); 
  6. if (!flag) 
  7.     AfxMessageBox(TEXT("加载d:\\UserInfos.xml失败,请检查")); 
  8.     return
  9.  
  10. //定位到Root Elem 
  11. xml.ResetPos(); 
  12. flag = xml.FindElem("UserInfos");  //Root Elem为<UserInfos></UserInfos> 
  13. if (!flag) 
  14.     return
  15.  
  16. xml.IntoElem();   //进入根节点 
  17. while(xml.FindElem(TEXT("UserInfo"))) 
  18.     xml.IntoElem();   //进入<UserInfo></UserInfo> 
  19.  
  20.     //获取name节点数据 
  21.     flag = xml.FindElem(TEXT("name")); 
  22.     if (flag) 
  23.     { 
  24.         CString cstrName; 
  25.         cstrName = xml.GetData(); 
  26.         AfxMessageBox(cstrName); 
  27.     } 
  28.  
  29.     //获取age节点数据 
  30.     xml.ResetMainPos();   //保证不管name节点和age节点的顺序如何,都能找到age节点 
  31.     flag = xml.FindElem(TEXT("age")); 
  32.     if (flag) 
  33.     { 
  34.         CString cstrAge; 
  35.         cstrAge = xml.GetData(); 
  36.         AfxMessageBox(cstrAge); 
  37.     } 
  38.  
  39.     xml.OutOfElem();  //跳出<UserInfo></UserInfo> 
  40. xml.OutOfElem();  //跳出根节点 
     CMarkup xml;
	bool    flag;

	//加载Xml文件
	flag = xml.Load("d:\\UserInfos.xml");
	if (!flag)
	{
		AfxMessageBox(TEXT("加载d:\\UserInfos.xml失败,请检查"));
		return;
	}

	//定位到Root Elem
	xml.ResetPos();
	flag = xml.FindElem("UserInfos");  //Root Elem为<UserInfos></UserInfos>
	if (!flag)
	{
		return;
	}

	xml.IntoElem();   //进入根节点
	while(xml.FindElem(TEXT("UserInfo")))
	{
		xml.IntoElem();   //进入<UserInfo></UserInfo>

		//获取name节点数据
		flag = xml.FindElem(TEXT("name"));
		if (flag)
		{
			CString cstrName;
			cstrName = xml.GetData();
			AfxMessageBox(cstrName);
		}

		//获取age节点数据
		xml.ResetMainPos();   //保证不管name节点和age节点的顺序如何,都能找到age节点
		flag = xml.FindElem(TEXT("age"));
		if (flag)
		{
			CString cstrAge;
			cstrAge = xml.GetData();
			AfxMessageBox(cstrAge);
		}

		xml.OutOfElem();  //跳出<UserInfo></UserInfo>
	}
	xml.OutOfElem();  //跳出根节点

当然实现同样的功能也可以不进入UserInfo节点,源码如下,请仔细对比

  1. xml.IntoElem();   //进入根节点 
  2. while(xml.FindElem(TEXT("UserInfo"))) 
  3.     //获取name子节点数据 
  4.     flag = xml.FindChildElem(TEXT("name")); 
  5.     if (flag) 
  6.     { 
  7.         CString cstrName; 
  8.         cstrName = xml.GetChildData(); 
  9.         AfxMessageBox(cstrName); 
  10.     } 
  11.  
  12.     //获取age子节点数据 
  13.     xml.ResetChildPos();   //保证不管name子节点和age子节点的顺序如何,都能找到age子节点 
  14.     flag = xml.FindChildElem(TEXT("age")); 
  15.     if (flag) 
  16.     { 
  17.         CString cstrAge; 
  18.         cstrAge = xml.GetChildData(); 
  19.         AfxMessageBox(cstrAge); 
  20.     } 
  21. xml.OutOfElem();  //跳出根节点 
	xml.IntoElem();   //进入根节点
	while(xml.FindElem(TEXT("UserInfo")))
	{
		//获取name子节点数据
		flag = xml.FindChildElem(TEXT("name"));
		if (flag)
		{
			CString cstrName;
			cstrName = xml.GetChildData();
			AfxMessageBox(cstrName);
		}

		//获取age子节点数据
		xml.ResetChildPos();   //保证不管name子节点和age子节点的顺序如何,都能找到age子节点
		flag = xml.FindChildElem(TEXT("age"));
		if (flag)
		{
			CString cstrAge;
			cstrAge = xml.GetChildData();
			AfxMessageBox(cstrAge);
		}
	}
	xml.OutOfElem();  //跳出根节点

具体CMarkup类方法的使用请参阅官方网站上的详细说明:http://www.firstobject.com/dn_markupmethods.htm

Tips:

1.IntoElem与OutOfElem方法应成对使用

2.关于重置xml的Pos的函数

ResetPos Resets the current position to the start of the document
ResetMainPos Resets the current main position to before the first sibling
ResetChildPos Resets the current child position to before the first child

3.SavePos 与 RestorePos 复原xml Pos

SavePos Saves the current position with an optional string name using a hash map
RestorePos Goes to the position saved with SavePos
比如:

...

xml.SavePos(Text("abc"));

OpXml(xml);  //该函数可能会改变xml的Pos,则可以利用SavePos与RestorePos复原该函数执行前xml的Pos

xml.RestorePos(Text("abc"));

...


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值