用C++编写XML解析器(三)

3 篇文章 0 订阅
编写XML解析器只使用栈做校验还是远远不够的,校验可以说只是编写XML解析器的第一步,也是最基本最简单的一步,后面的内容将更为复杂,下面我尽量用文字做详细讲解,有不明白的请留言交流或发E-mail给我。

在这篇文章中我将具体介绍XML解析器的类设计,以及各个类的功能,当然我说到的类名称也可以被其它名称替代,我所提到的设计框架也并不唯一,只要能给大家提供一个可以参考的思路就好。

为了完成XML的解析,一共需要设计至少三个类,分别为:Xml类、XMLList类、XMLNode类,下面一一介绍各个类的功能。

Xml类:是直接可以在外部使用的类,功能包括提供校验XML是否标准的方法,包括访问Xml各个节点的方法,未来也应该包括访问Xml属性的方法以及写入Xml、添加节点的方法等。为了能够提供对Xml文件和Xml字符串的解析,建议多写几个构造函数,这样在使用的时候会很方便。

XMLList类:在XMLList类存放同名的节点,节点的存放方式可以有多种,可以是链表存放,也可以是数组存放,我个人建议使用STL的vector存放,效率高,访问控制简单。如果有兴趣也可以自己编写DynamicArray类。如果要实现“用C++编写XML解析器(一)”中提到的

                           能通过以下的方式访问相应的节点:
 
                             Xml xml("test.xml");                         //test.xml中的内容为<nnn>abc</nnn><nnn>xyz</nnn>
                               xml.child("nnn")[0];                         //将得到字符串abc
                               xml.child("nnn")[1];                         //将得到字符串xyz

则必须在XMLList类中重载下标【】运算符。另外,这里提到同名是指在XML中的标签同名,即:

<nnn>节点1</nnn>
<nnn>节点2</nnn>
<ccc>节点3</ccc>

当中“节点一”和“节点二”同名,而和“节点三”不同名。


XMLNode类:在XMLNode类中存放节点内容,即被开始标签和结束标签保卫的内容,所以这个类简单的写就是对一个string类型的封装,不过为了安全,请完善对该string属性的读写方法。

所有的解析器都采用扫描的方式解析字符串内容,XML解析器也不例外,为了方便且易于教学,我采用了三次扫描的方式完成,请大家借鉴:

第一次:XML合法性扫描,即:校验被解析的XML内容是否标准。
第二次:XML节点统计扫描,即:获取节点类型数及各个类型节点个数。
第三次:XML节点内容装载扫描,即:将节点内容装入XML类中,并按照逻辑安排好,随时备用。

其中第一次如何扫描的思路已经写在“用C++编写XML解析器(二)”中,因为时间关系先写到这里,至于第二扫描和第三次扫描将在后面的文章中介绍,希望能给大家带来些许帮助。


转载:http://blog.sina.com.cn/s/blog_6ce09de90100o4aj.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值