新闻中心 | 电脑硬件 | 手机 | 数码相机 | 笔记本频道 | 服务器 | 美图频道 「总」 生活频道 渔鱼频道 电影频道 游戏频道 旅游频道 设为首页 | 收藏
网络学院
迷城学吧
硬件
手机
旅游
生活
渔鱼
美图
电影
游戏
  导航: 迷城学吧 · 系统编程教程 · VC语言 · VC .net和xml  

简略实用地Xml解释分析类

图文推荐
『简略实用地Xml解释分析类』可能有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2007-4-18 10:20:51 
下载源代码

  今天有点郁闷,不想干活。整理代码的时候,看到了这个好久之前写的代码,于是想整理出来供大家拍砖。XML的解析对于.Net平台那真是太简单不过了,感谢微软。但对于C++语言的XML解析就没那么容易了。有一个开源的XML4C是IBM的,功能强大,但代码大的有几M,而且对于GB2312的支持有问题,据说能解决,但可能是我天生愚钝,当初我花了2周时间也没搞定,最后放弃,自己写了一个。咦?还能跑起来,也能跨平台:)。 写这个XML解析类,以功能最简单,最实用,最常用的功能为原则,因为只能解析,查找,没有XML文档生成器。如果需要生成XMl文档,还是自己拼凑字串吧。
  此解析器的接口完全模仿XML4C的对外接口,使用也很类似,稍有不同,对复杂部分进行了封装。总共分3个类: CPacket、DOMElement、DOMDocument。 DOMElement为节点类,主有有tag、level、 parent、childlist 等几个属性。DOMElement类主要是对XML文档的解析,生成,对整个XML文档 生成DOM树。CPacket主要是对XML文档的封装,提供对外的接口。

下面简单示例一下使用方法:

1、创建DOM树,得到XML对象:

解析分两种,第一种是对xml string 字串的解析,另一种是对文件的解析。对应函数分别为:


   CPacket::BuiltTree(const char* pBuf,int nBufSize);

   CPacket::BuiltTree(MLPCSTR pXmlPath);

使用示例:

   CPacket inPacket;

   DOMElement* TransNode = NULL;

   DOMElement* AccNode = NULL;



   inPacket.BuiltTree(strXml.c_str(),strXml.size());     //生成DOM树结构.

   inPacket.BuiltTree("c:\\1.xml");                      //生成DOM树结构.

2、对原有DOM树添加子结点:

可以通过CPacket::CreateElement(char szNodeName[]) 来创建字节点,示例:


   

   (1)CPacket::CreateElement("/Root/Cust/Tel")

会在根节点下创建Root/Cust/Tel 如果存在Root和Cust节点了则不在创建,否则会创建3个节点,Root,Cust,Tel 并且具有父子关系。

   (2)CPacket::CreateElement("Root/Cust/Tel")

  会在当前节点下创建Root,Cust,Tel,至于当前节点,可以通过SetCurrentElement 来设置,默认根节点是当前节点. 3、节点的查找,节点的查找,有4个函数可以用:

   CPacket::SearchElement(char * szNodeName);                              //搜索普通节点,分绝对路径(路径以/开头),相对路径

   CPacket::SearchElement(char * szNodeName,char * szProper,char * szId);  //指定属性

   CPacket::SearchNextElement(bool pMoveNext = TRUE);           //当前节点的下一个兄弟节点,参数决定向下移动当前节点,这个函数速度最快

   CPacket::SearchNextElement(char *szNodeName,char *szProper = NULL,char *szId = NULL); //下一个节点

整体使用示例:

 void main()

 {

   string strXml = "";

   CPacket inPacket;

   DOMElement* TransNode = NULL;

   DOMElement* AccNode = NULL;



   inPacket.BuiltTree(strXml.c_str(),strXml.size());//生成DOM树结构.

   

   printf("%s",inPacket.GetXml(NULL).c_str());



   //MessageBox(inPacket.GetXml(NULL).c_str());

   

   AccNode = inPacket.SearchElement("/Xml/Body/TelNums/TelNum");



   if(!AccNode)

	   return;



   inPacket.SetCurrentElement(AccNode);

   

   while(AccNode)

   {

	printf("%s",AccNode->getTextContent());

	MessageBox(AccNode->getTextContent());

	AccNode = inPacket.SearchNextElement(true);

   }  

   

   

   //注意因为当前节点已经不是根节点,因此如果是全局查找就要在节点名前加上"/" 的全局路径

   //AccNode = inPacket.SearchElement("/TelNum","Id","1");   

   inPacket.ResetCurrentNode();

   AccNode = inPacket.SearchElement("TelNum","Id","1");

   

   printf("%s",AccNode->getTextContent());

   //MessageBox(AccNode->getTextContent());

   

   //创建XML文档

   CPacket outPacket;

   outPacket.SetRootTag("Root");

   AccNode = outPacket.CreateElement("/Root/Cust/Tel");

   AccNode->setTextContent("075507895461");

   printf("%s",outPacket.GetXml(NULL).c_str());

   //MessageBox(outPacket.GetXml(NULL).c_str());

   

  }

  当时写的时候仅仅是为了满足我自己使用的方便,很多复杂功能没有实现,代码测试也远远不够,问题很多,真有点怕误导大家,希望大家看后,能够重新写一份出来,供大家使用,有问题发邮件给我:mycrolee@163.com 原来的邮箱mycro@163.com 被一个LJ给盗了。永远BS这种渣滓。

】【关闭窗口
  ·上一篇:
  ·下一篇: 没有了
VC .net和xml:相关文章
VC .net和xml点击榜
普通教程简略实用地Xml解释分析类
普通教程运用gSoap完成企业级数据存储运
普通教程XML文件地简略初步解释分析
普通教程探讨与对比Java和.NET地事件处理
普通教程.NET架构地核心设计技术
普通教程汇总c#.net常用函数和办法集
普通教程FTP客户端库(C#)
普通教程运用 .Net XML 解释分析 Execl 
推荐教程真正地全动态报表:RDLC+Report
推荐教程C# 2.0匿名办法揭密
网友自拍|生活百味|历史图片|摄影世界|明星图片|体坛图库|美女图片|图片纪实|世界奇观
电脑硬件推荐文章
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 库库中文网 | 设为首页 | 本页加入收藏 返回顶部
网站文本地图
版权所有:迷城学吧 欢迎各种媒体转载我们的原创作品[转载请注明出处]
Copyright © 2005-2008 www.McXb.com online services. all rights reserved. 蜀ICP备09003996
Template designed by Monsi. Optimized for 1024x768 to Firefox and MS-IE6 7. Site powered by JoyON.
红盾Gov315
有一个迷样的城市
在每个人的内心深处
让我们探索发掘这古老的墓