网络上有许多XML开源的解析器,例如libxml,tinyxml等。之前研究过一段C语言写的XML解析器,基于状态机的思想。最近项目有用到XML文件就把tinyxml也研究了一下,顺便把之前那个C语言写的解析器与tinyxml的部分来了个结合,得到一个杂交产物:XMLPARSER-C++BINDING,以下简称BINDING。
这里说说BINDING运用到的一些知识点。
1.Visitor(访问者)模式,按照官方的说法:visitor模式定义一组操作,作用于某个对象结构里的各个元素。
达到不修改元素的前提下给元素增加新的操作。在XML解析器结束后我们会得到各种类别的node,例如之前说到的COMMENT(注释)/TEXT(文本)/START_TAG(起始标签)等等。不同的客户会对这些node做不一样的操作,有些可能只是希望把这些node的内容打印出来而已,有些可能希望把这些内容输出写到文本文件,或者通过网络发送给其他客户端等等。Visitor的作用当然不止于此,<<可复用对象软件>>总结了visitor:适用于一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。在这里只是个人觉得用的恰倒好处。Binding提供了一个默认的PrinterVisitor用于把BINDING构建的DOM树节点内容输出,也可以说是为了DEBUG目的吧!
2.清晰的TREE结构。之前写的C版本的PARSER基于builder模式,没有树的概念,操作起来还是有一定的弊端,有了DOM树可以有更加清晰的层次结构。用户看到的是一个DOCUMENT对象,该对象可以看成是树的root节点,root节点的第一个子节点一定是预处理指令节点即:包含一些XML文件的版本信息以及编码方式。需要说明的是,start_tag节点与同名的end_tag属于同级节点,start_tag允许包含其他start_tag节点,text节点,comment节点等,是一个递归的操作。如果需要得到某个start_tag所包含的内容,那么遍历终止的条件一定是得到一个同级的同名的end_tag节点。
PS:其他操作请参看源码:点击下载 The_End。