您的位置:首页 > 编程语言 > C语言/C++

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

2013-03-02 13:08 148 查看
编写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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: