XML文件解析器TXml__第1页
XML文件解析器TXml__第2页
XML文件解析器TXml__第3页
XML文件解析器TXml__第4页
XML文件解析器TXml__第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、XML文件解析器TXml_ 前几天看了开源的XML文件解析器TinyXml,它是怎么实现解析的没怎么看懂,于是决定自己实现一个,反正最近不忙。先命名为TXml。现在完成了解析和查询功能,全部代码加起来不到1000行,将会连续完善它。源码必共享 先简洁说一下我的思路: 1:读取XML文件信息,并存入一个字符数组中; 2:遍历数组,将数组解析成一棵树; 3:以路径的方式查询和按属性查询; 这个解析器最麻烦的地方就在怎么将字符数组解析成一颗树。我们先看一下一个简洁XML文件,他包括文件头、节点、节点名称及节点值、属性名称及属性值,子节点、父节点、说明等。 ?xml version=1.0 encod

2、ing=utf-8 ? !-说明- Items item name=chentaihan89757/item /Items 简洁介绍一下解析的实现,不太好说清晰,看代码可能更简单理解一些。递归实现,每次都从一个节点开头解析,就是 从字符“”开头,到字符“”结束,字符后面就是节点的名称,之后的就是节点属性,字符后一个字符假如不是,那就 是节点的值,假如是字符,可能是子节点也可能是这个节点结束了。遇到字符开头递归,空格和说明挺直被PASS。 代码如下: const char* TXmlParser:ParseContent(const char* p,XmlNode* baseNode) if(p

3、=NULL | !*p) return NULL; if(*p=)/开头一个节点 bool isNote; p=SkipNote(p,isNote);/跳过说明 if(isNote) /是说明 ParseContent(p,baseNode); return NULL; if(*p=/)/结束节点 while(p!=NULL *p *p!=) p+; +p=SkipWhiteSpace(p); ParseContent(p,baseNode-parent);/新节点 else /节点属性 string name; while(p!=NULL *p *p!= *p!= *p!=/) name.p

4、ush_back(*p+); XmlNode* node=new XmlNode(name,baseNode); baseNode-AppendNode(node); if(*p=) +p=SkipWhiteSpace(p); ParseContent(p,node);/新节点 else p=GetAttr(p,node); if(*p=/) while(p!=NULL *p *p!=) p+; ParseContent(p,baseNode);/新节点 else +p=SkipWhiteSpace(p); ParseContent(p,node);/新节点 else/节点的值 GetNode

5、Value(p,baseNode); 按路径的方式查询。利用两个数组实现,假设这两个数组分别为A,B;第一次查询将结果存入数组A,将A作为数据 源,将查询结果存入B,清除A中的数据,将B作为数据源,将查询结果存入A,反复进行,最终A,B中有一个就是查询结果。当然也可以用递归实现,我们都知 道递归太深简单爆线程栈,且性能低。 按属性查询。同样没有用递归实现,有个常常消失的面试题:按层序打印一个棵树。那么这里也是按层序查找,就是利用一个队列,按根节点、根节点的挺直子节点进栈,一个个匹配,不匹配就出队列。 /依据属性查询-利用队列按层序查询 XmlNode* XmlNode:SelectSingle

6、NodeByAttr(const string attrName,const string attrValue,XmlNode* node) if(node=NULL) return NULL; if(node-attribute!=NULL (*node-attribute)attrName=attrValue) return node; queueXmlNode* list; for(int i=node-ChildCount()-1;i=0;i-) list.push(*node-childNodes)i); while(list.size()0) XmlNode* tmpNode=list.front(); if(tmpNode-attribute!=NULL (*tmpNode-attribute)attrName=attrValue) return tmpNode; for(int i=tmpNode-ChildCount()-1;i=0;i-) list.push(*tmpNode-childNodes)i); list.pop(); return NULL; 看了按属性查找,我们就很简单知道,C#中ConfigurationManager读取配置文件的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论