XML文件解析器TXml_.docx

上传人:啊飒飒 文档编号:11626674 上传时间:2021-08-26 格式:DOCX 页数:6 大小:13.33KB
返回 下载 相关 举报
XML文件解析器TXml_.docx_第1页
第1页 / 共6页
XML文件解析器TXml_.docx_第2页
第2页 / 共6页
XML文件解析器TXml_.docx_第3页
第3页 / 共6页
XML文件解析器TXml_.docx_第4页
第4页 / 共6页
XML文件解析器TXml_.docx_第5页
第5页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《XML文件解析器TXml_.docx》由会员分享,可在线阅读,更多相关《XML文件解析器TXml_.docx(6页珍藏版)》请在三一文库上搜索。

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=li

7、st.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读取配置文件的大致实现,由于配置文件很简洁,就是一个节点下 面有多个节点,完全可以这样实现,根节点基本可以无视,挺直就是一个字典,KEY存key的值,VALUE存value的值,查找的时间简单度就是 O(1)。 简洁测试: .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1