嵌入式环境下Web Service技术的实现
2.2.2 XML解析
SOAP消息是由XML语言组成的,因此对XML的解析是处理SOAP消息的一个重点。当今有2种流行的XML解析API,它们是DOM(Document Obj ect Model)和SAX(Simple API for XML),尽管这两种方法都能用来解析XML数据,但相互间却有很多本质的不同:DOM一次性把整个XML文档读入内存并建立完整的树结构,而SAX则基于事件驱动模型,一次只读取一个XML元素,每当遇到一个读取事件时就会触发一个事件处理器。两种方法各有优缺点:DOM在处理单个元素之前必须把其他所有的元素都读入内存建立树结构,这既费时间又费内存,在这方面SAX的性能
更为优异,但DOM一旦建立树结构之后,就可以方便地处理文档中的任意元素,因为整个XML结构都在内存里,而SAX则必须从头逐个解析XML文档每一个元素,直到需要的那个元素。
考虑到SOAP消息的解析是一次性的过程,不需要进行元素的随机访问,而且嵌入式环境下资源有限,为此采用SAX做为XML的解析方式。定义以下结构体用来存储节点结构。

另外建立一个列表用来存储XML文档中声明的命名空间,避免XML文档里的元素名或属性名相互之间可能会发生的语义冲突。在XML文档的解析过程中,保留当前节点及其父节点的结构体,除此之外的节点在读取完毕后立即释放其占用的资源,必要时还可以关闭对节点属性的解析,进一步降低内存消耗。当遇到新的读取事件时(节点开始、节点结束、发现节点值),将此次事件的相关信息作为参数传入回调函数,在回调函数中对节点信息进行处理:

2.2.3 具体服务实现
为了方便查找服务,程序里将所有支持的服务函数的名称以及对应的命名空间预先保存在一个列表中。当进入XML解析的回调函数后,根据XML节点的节点名称以及命名空间,首先试图从列表中搜索本次SOAP消息所请求的服务,如果所请求的服务函数存在,则将XML节点信息传入该服务函数对应的初始化函数,完成对服务函数的参数列表的初始化,为之后的服务函数执行做好准备。图3给出了该过程的程序框图。XML解析完毕后退出XML解析器,此时服务函数也已经完成初始化,直接调用服务函数的执行部分,并将结果打包成SOAP格式发送回客户端。鉴于动态生成XML文档需要耗费较多的资源,程序中为每个服务函数预存了一个模板,模板中已经定义好了回复消息的整体结构,仅需在服务函数被实际调用后往模板中填入结果即可,另外可以在发送回复消息的过程中复用之前的接收缓冲区,这样一来同时节省了处理时间和资源消耗。本文引用地址:https://www.eepw.com.cn/article/149382.htm
c++相关文章:c++教程
评论