.NET框架为XML所提供的拉方法(pull method)简化了对XML文家的读写过程——这要归功于XmlReader 和XmlWriter导出类。让我们看看XmlReader 和XmlWriter类是如何处理XML文档的。(如果你想对拉方法和.NET的XML类有个高层次的认识,请参阅《带你遨游.NET的XML世界》)
我已经写好了一个工作在控制台模式下的应用程序,它是一个很不错的例子,而且特别贴近实际情况。用户可以用这个名位XMLDemoCSharp的项目(你可以在这儿下载源代码)来把一个书单当作XML文档来维护。书的目录很快就会成为规范的XML例子,从XML书目中找到你需要的东西总是比埋头于标签要简单些。你可以免费使用清单A中的例子文档,不过你可不要说我什么功能也没有实现,OK?
XMLDemoCSharp中的大部分代码是用来处理用户界面的,如果你考虑到我在这个项目中为了简化而使用了控制台模式,就会发现这很有讽刺意味。你可以充分忽略这其中的大多数代码,而把精力集中在Book类上,Book类实现把书整合到书目中的功能。Book类提供两个静态方法来分别提取和保存书目,即LoadBooks和SaveBooks。
XMLDemoCSharp首先通过调用LoadBooks方法来载入书目,代码如清单B中所示。LoadBooks使用System.Xml.XmlTextReader实(concrete)类来一个元素接着一个元素的读取XML文档,并创建一个System.Collections.ArrayList来表示书目中的书。XmlTextReader是一个前向(只能前向)的语法分析器(parser),其工作方式与SAX相似,它按照元素在文档出现的顺序从头到尾检索元素。尽管XmlTextReader并不支持有效性验证(validation),但是它的速度很快并且并不很消耗资源。同样,如果速度是你的优化目标又或者你不需要像XML schema或者DTD那样要求有效性验证(validation),XmlTextReader是你理想的选择。
用阅读器来读取(up)流
XmlTextReader可以控制阅读文件过程的细节(被读文件的URL是你在XmlTextReader的构造函数中指定的),它也可以通过一个System.IO.Stream对象来读XML文档。流是允许你访问灵活的输入和输出设备,它不仅可以是文件,也可以是内存或者网络数据(network data)。如果你现在不习惯.NET的基于流的输入输出操作,我建议你尽快熟悉它。