• 2004-06-18

    大头随笔(四)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/227677.html

    最初接触XML是在大学里,因为其名字与HTML的相似性,于是我就顺水推舟地认为XML也是用来做网页的。找到网上的名著《无废话XML》,用IE打开了其第一个例子,颇感奇怪地发现其结果和我想像的并不一致,基本上就是源代码重现(当然,有细微的差别,节点是可以伸缩的,就像树型控件一样。不过,当时我没发现)。实在看不出这个XML有什么用,于是大学里对XML的探索也就基本上到此为止了。

    后来看过的一些东西都在说XML有多强大,有神奇,一直觉得很难理解,不就是和HTML一样的一堆标签吗?要说比HTML强,无非是它的标签可以自定义,哪里看出它强大神奇了。

    很凑巧,工作后的第一个项目用到了SOAP,而要了解SOAP,首先要了解的就是XML。于是,我开始了新一次学习XML的历程。如果说这次学习XML是项目所迫,那倒是有一个优点,那就是学习XML有了真正的应用环境。之所以,自己以前对XML有一些误解,完全是因为自己的知之甚少加上没有应用环境造成的(由此可见,学习一样新技术,应用是多重要了^_^)。

    这次的教材我选择的还是那本《无废话XML》。与最初接触XML时不同,这次我完全没有把XML看成一种做网页的语言,而是看成一种数据的记录方式。为什么?因为我们项目中关键的通信协议是SOAP来定义的,而SOAP就是用XML来定义的。所以,我知道了XML可以用作数据记录和传输。其实说起来XML的基本语法确实很简单,简单到一个由标签组成的语言,居然本身几乎没有定义任何标签。

    有了应用环境,XML学习起来还是很快的,基本上,一个上午就可以把那些基本语法浏览一遍。与在课堂上学习不同,在项目中学习一些东西,有个很大的缺点,就是不那么系统。和一个好朋友曾经就此交流过,因为他和我说,自己好像工作了这么长时间没有什么长进,而事实上,他的水平比起念书的时候提高了很多,就是因为知识的不系统,使他觉得自己长进不大。

    回头接着说。要想把XML结合到自己的程序中,要做的第一项工作就是解析XML,从XML中提取自己需要的内容。这里的解析可不只是解析文本文件,也可能是网络中传过来的文本流。现在流行的解析方法主要有两种:SAX(Simple API for XML)和DOM(Document Object Model)。

    学过编译原理的人都还记得词法分析吧!一般就是读源程序,然后,根据读进来的字节分析个字节在这里出现是否合理,比如当前词法分析器认为自己正在处理的是一个浮点数,结果又冒出一个小数点来,它一下子就懵了,只好提示用户,自己看不懂。这种根据前面处理结果结合新来的东西得出新的处理结果的过程,做学问的人称之为有限状态机。词法分析完了就是语法分析了,同样的字组成的句子可不是谁都能理解的,词法分析器干的就是看看源程序说的是不是“行话”。

    说过这些东西,再来说解析XML可能会好懂一些。SAX相当于读一点解析一点,可以认为是词法分析和语法分析在一个过程中进行了。需要自己做的实际上相当于是一个语法分析的过程。在Java中实现这个过程,一般就是自己实现一个Handler类,这个类要继承自一个Handler的基类,把其中的几个方法改写成自己想要的东西。之所以说,SAX是和词法分析过程紧密联系在一起,从其API的方法定义中就可以看出来,它的接口更多的是代表词法的字符串、字符数组等等。可能到这里还体现的不是很明显。那就先来看看DOM,对比一下就知道了。

    DOM和SAX最大的不同,在于它并急于让用户参与到解析过程中,自己先慢慢地把所有内容解析了,在内存中形成一棵树。这所以XML可以形成一棵树,因为它的标签可以层层嵌套,看起来,里面的节点就像外面节点的“孩子”一样,而学过数据结构的人就可以看出,只要把节点和叶子对应,这和树是一样的。在编程实现上,与SAX很明显的一点不同在于,前面说到的那个Handler类需要在开始正式的解析之前需要设置到解析器(parser)中,然后再行解析,这就使得这个Handler可以参与到XML的解析过程中。而DOM完全不必理会这些,解析过程进行去吧!给我解析的结果就可以了。从API上可以看出它与解析过程无关,它的API中更多的是Document、Node、Element之类已经上升到逻辑高度一级的东西。

    从这些解释中可以看出,DOM逻辑性更强一些,但它很吃亏的一点在于它需要在内存中形成一棵树,于是不可避免的要比SAX浪费更多的内存。

    不管怎么样,解析XML都是一件费时费力的事。用XML作承载的协议,比如SOAP,虽然有种种诸如跨平台等等的优点,但处理起来一般简单定义的协议浪费掉更多的时间。所以,对于用XML作承载的协议,不要对其处理效率报有很高的期望。

    上面几次提到SOAP,这里就不妨在说上几句。SOAP这两年很火,我在做这个项目之前,也是只闻其名,不见其实,于是对它产生了一种莫名的崇敬。SOAP究竟是什么呢?Simple Object Access Protocol——简单对象访问协议。如果拿来SOAP规范看,保证很多人和我当初一样,看不了几页就眼发花、头发晕。其实,SOAP之所以敢称简单,依我看,它是因为自己几乎什么新东西都没有造成的。协议的数据格式完全是用XML来定义的,传输协议可以使用HTTP或是SMTP,不过,据说HTTP用的多一些,因为一般的防火墙对HTTP是不设防的。协议内容有了,传输有了,还要什么?所以,我说它自己几乎什么都没有。要说符合SOAP的XML文件和一般的XML有什么区别的话,那就是SOAP里要求分为头和体两部分,具体头和体内容,那就是自己的问题了。项目开发到后期,我们自己就利用SOAP定义了一套自己的协议。另外,SOAP消息后面还可以携带多媒体附件,比如文本、图像,也就是利用SOAP消息可以传输很多东西,当然这相当于对XML做了一些扩展。

    既然说到了SOAP,就顺便说一下Web Service吧!

    关注一下这几年的报道,就会发现Web Service是上镜率极高的词。抛开其推广者和媒体的溢美之词和诸多美好构想。作为开发人员,我们关注更多的是其实现一级的东西。Web Service其实就是一个以SOAP作为其实现协议来实现的一种服务。也就是说,一方发起一个SOAP消息,另一方(也就是提供服务的一方)得到消息,进行处理,然后,将处理结果生成一个SOAP消息发回去。具体实现什么,还是上面的那句话,那就是自己的问题了。

    如果是用Java来实现Web Service,那可以到Sun的网站上找来JWSDP(Java Web Service Developer Pack)。Sun还提供了相应的教程,找几个例子试一下,会觉得自己也加入了比较前沿的一族。如果用C#,可能更简单。以前在做毕设的时候,有个同学就是用C#来实现一个Web Service,当时,我还对此一无所知。只见他托托点点,写了几行代码,一个Web Service的例程就完成了,羡慕得不得了。

    不过,话说回来。SOAP和Web Service并不只有我上面说的那么点东西,还是有很多的东西要去学,去了解的。像Web Service中非常重要的服务发布、查找等等就被我忽略不计了。之所以这种方式表达,完全是因为自己对这些很重要的东西了解不多,不敢胡说,更重要的是因为不想让它们看起来那么神秘。SOAP和Web Service曾经是在我心目中地位极高,虽然现在我对它们了解也并不多,但理解一些原理就不再觉得它们神秘,于是它们俩都被拉下了我心目中的神坛。我是在只对XML基本语法有了解的情况下去接触它们的,由此可见,其难度并不是很大。反过来看,它们的简单也正说明了其设计者水平的高超,简单的设计才是好的设计。

    几乎是走马观花般的说了一遍,XML相关的东西可决不只这么一点点。本来很想把自己了解的东西一一“炫耀”一番,可我实在不想让一篇小品文成为一部小说,只好就此收住了。

    分享到:

    历史上的今天:

    Hello, Modernizr 2011-06-18
    苍天作弄 2008-06-18
    引用地址:

    评论

  • 相关技术请参照:
    http://fengyehongyu.blog.163.com/