在.net framework中,xmltextreader和xmltextwriter类提供了对xml数据的读和写操作。在本文中,作者讲述了xml阅读器(reader)的体系结构及它们怎样与xmldom 和sax 解释器结合。作者也演示了怎么样运用阅读器分析和验证xml文档,怎么样创建格式良好的xml文档,以及怎么样用函数读/写基于base64和binhex编码的大型的xml文档。最后,作者讲了怎么样实现一个基于流的读/写分析器,它把读写器都封装在一个单独的类里。
大概三年前,我参加了一个软件研讨会,主题是“没有xml,就没有编程的未来”。xml确实也在一步一步的发展,它已经嵌入到. net framework中了。在本文中,我将讲解. net framework中用于处理xml文档的api的角色和它的内部特性,然后我将演示一些常用的功能。
从msxml到.net的xml
在. net framework出现之前,你习惯使用msxml服务----一个基于com的类库---写windows的xml的驱动程序。不像. net framework中的类,msxml类库的部分代码比api更深,它完全的嵌在操作系统的底层。msxml的确能够与你的应用程序通信,但是它不能真正的与外部环境结合。
msxml类库能在win32中被导入,也能在clr中运用,但它只能作为一个外部服务器组件使用。但是基于.net framework的应用程序能直接的用xml类与.net framework 的其它命名空间整合使用,并且写出来的代码易于阅读。
作为一个独立的组件,msxml分析器提供了一些高级的特性如异步分析。这个特性在.net framework中的xml类及.net framework的其它类都没有提供,但是,net framework中的xml类与其它的类整合可以很轻易的获得相同的功能,在这个基础上你可以增加更多的功能。
.net framework中的xml类提供了基本的分析、查询、转换xml数据的功能。在.net framework中,你可以找到支持xpath查询和xslt转换的类,及读/写xml文档的类。另外,.net framework也包含了其它处理xml的类,例如对象的序列化(xmlserializer和the soapformatter类),应用程序配置(appsettingsreader类),数据存储(dataset类)。在本文中,我只讨论实现基本xml i/o操作的类。
xml分析模式
既然xml是一种标记语言,就应该有一种工具按一定的语法来分析和理解存储在文档中信息。这个工具就是xml分析器---一个组件用于读标记文本并返回指定平台的对象。
所有的xml分析器,不管它属于哪个操作平台,不外乎都分以下的两类:基于树或者基于事件的处理器。这两类通常都是用xmldom(the microsoft xml document object model)和sax(simple api for xml)来实现。xmldom分析器是一个普通的基于树的api---它把xml文档当成一个内存结构树呈现。sax分析器是基于事件的api----它处理每个在xml数据流中的元素(它把xml数据放进流中再进行处理)。通常,dom能被一个sax流载入并执行,因此,这两类的处理不是相互排斥的。
总的来说,sax分析器与xmldom分析器正好相反,它们的分析模式存在着极大的差别。xmldom被很好的定义在它的functionalition集合里面,你不能扩展它。当它在处理一个大型的文档时,它要占用很大内存空间来处理functionalition这个巨大的集合。
sax分析器利用客户端应用程序通过现存的指定平台的对象的实例去处理分析事件。sax分析器控制整个处理过程,把数据“推出”到处理程序,该处理程序依次接受或拒绝处理数据。这种模式的优点是只需很少的内存空间。
.net framework完全支持xmldom模式,但它不支持sax模式。为什么呢?因为.net framework支持两种不同的分析模式:xmldom分析器和xml阅读器。它显然不支持sax分析器,但这并不意味它没有提供类似sax分析器的功能。通过xml阅读器sax的所有的功能都能很容易的实现及更有效的运用。不像sax分析器,.net framework的阅读器整个都运作在客户端应用程序下面。这样,应用程序本身就可以只把真正需要的数据“推出”,然后从xml数据流中跳出来。而sax分析模式要处理所有的对应用程序有用和无用的信息。
阅读器是基于.net framework流模式工作的,它的工作方式类似于数据库的游标。有趣的是,实现类似游标分析模式的类提供对.net framework中的xmldom分析器的底层支持。xmlreader、xmlwriter两个抽象类是所有.net framework中xml类的基础类,包括xmldom类、ado.net驱动类及配置类。所以在.net framework中你有两种可选的方法去处理xml数据。用xmlreader和xmlwriter类直接处理xml数据,或者用xmldom模式处理。更多的关于在.net framework中读文档的介绍可以参见msdn 2002 年八月刊的cutting edge栏目文章。