用于xml的简单api
sax协议比文档对象模型(dom)需要进行更多的编程.它是事件驱动模型(你提供回调方法,解析器在读取xml数据的时候调用它们),因此很难实现可视化.最后,不能倒退回文档的前面部分或重新组织它,只能回退到一个串行数据流或重新组织从流中读取的字符. 【程序编程相关:使用IActiveDesktop对象的一】 eric armstrong 本章主要讨论simple api for xml (sax),它是一种事件驱动.串行存取xml文档的机制.这是多数servlet与面向网络的程序用来传送与接收xml文档的协议,因为在目前xml文档处理的可用机制中它最快并且所需内存最少. 【推荐阅读:VBA for EXCEL FAQ】 然而,即便是专门建立dom应用程序,仍然要熟悉sax模型,主要原因如下: 【扩展信息:JUnit代给我们的……】 由于上述原因,如果开发者编写面向用户的应用程序,且该应用程序显示xml文档并可能要对它进行修改,那么就应该使用教程下一部分介绍的dom机制,文档对象模型. 相同的错误处理 在解析dom文档时,会生成相同类型的异常,所以jaxp sax与dom应用程序的错误处理程序是相同的. 处理验证错误 默认情况下, 规范要求忽略验证错误(在该教程的这一部分中会详细介绍) .如果想要在验证错误事件中抛出一个异常(并且能这样做),那么就需要理解sax错误处理的工作原理. 转换现有数据 可以看到在本教程的dom节,可以使用一种机制将现有数据集转换成xml——然而,要充分利用该机制首先必须理解sax模型. 注意:可以在下面的地址中找到本章的例子: <jwsdp_home>/docs/tutorial/examples/jaxp/sax/samples.何时使用 sax
当要快速.高效地读取xml数据时,sax是无可挑剔的.它对内存的要求很小,因为它不构建xml数据的内部表示(树结构).它仅仅将读取的数据发送给应用程序——然后应用程序就可以随意处理它所见到的数据. 实际上,sax api类似于串行i/o流.在流进入的时候,可以看到数据,但是不能回到以前的位置或跳跃到不同的位置.总的说来,如果仅想读取数据并在这基础上运行应用程序它就非常有效. 理解sax事件模型对于将现有数据转换成xml非常有用.在从任意数据结构生成xml 可以看到,转换过程的关键是修改现有应用程序,以便在读取数据时发送合适的sax事件. 但是,当需要修改xml结构时——特别是需要互相修改的时候,使用类似于文档对象模型(dom)的内存结构更为合理. 然而,虽然dom提供了许多处理大型文档(如书与论文)的强大功能,但是还是需要进行复杂的编程 (在何时使用dom中详细介绍了该处理的细节) . 在简单的应用程序中,这么复杂是完全没有必要的.在快速开发与简单的应用程序中,使用面向对象的xml编程标准更加合理,在jdom 与dom4j中会具体介绍.编写简单的xml文件
现在开始编写一个用来进行幻灯片播放的xml数据的简单版本.在该练习中,使用文本编辑器创建数据,这样就能比较适应xml文件的基本格式.你将使用该文件并在以后的练习中对它进行扩展.创建文件
使用标准的文本编辑器,创建一个叫做slidesample.xml的文件. 注意: 这里已经有一个slidesample01.xml的版本.(可以浏览的版本是 slidesample01-xml.html)可以将该版本与你所编写的相比较,或者仅在阅读此指南时查看.编写声明
下一步,编写声明,其中该声明将文件标识为一个xml文档.声明以字符"<?"开始,这是处理指令的标准xml标识符.(在本教程的后面部分可以看到其他处理指令) <?xml version=´1.0´ encoding=´utf-8´?> 该行表明此文档是一个xml文档,它遵守xml1.0版本规范,并且使用8-位unicode字符编码方案.(要想获得编码方案的信息,请查看java编码方案 .) 由于没有指定文档是“独立的”,解析器假设该文档可能包含到其他文档的引用.想知道如何将一个文档指定为“独立的” .添加注释
注释会被xml解析器忽略.实际上,你根本就看不到它们,除非你激活解析器里的特殊设置.教程后面部分的处理词法事件中会详细介绍如何使用它.现在,添加下面突出显示的内容,在文件中增加一条注释. <?xml version=´1.0´ encoding=´utf-8´?> <!-- a sample set of slides -->定义根(root)元素
在声明之后,每个xml文件都会精确地定义一个元素,这就是根元素.文件中的任何其他元素都包含在该元素中.输入下面突出显示文本,定义该文件的根元素slideshow:<?xml version=´1.0´ encoding=´utf-8´?> <!-- a sample set of slides --> <slideshow> </slideshow> 注意:xml元素命名是大小写敏感的.结束标签必须与起始标签匹配.给元素添加属性
幻灯片播放有大量相关数据项,它们都不需要任何结构.所以可以将它们定义成slideshow 元素的属性.添加下面突出显示的文本,建立一些属性: ... <slideshow title="sample slide show" date="date of publication" author="yours truly" > </slideshow> 在创建标签或属性的名字时,除了字符与数字之外还可以使用连字符 ("-"),下划线("_"),冒号 (":")与句点 (".") .与html不同, xml属性的值通常在引号之内,并且不用逗号分隔多个属性. 注意: 要慎重使用冒号或避免一起使用,因为在定义xml文档的命名空间的时候也要使用它.添加嵌套元素
xml能够表示层次结构化数据,这意味着一个元素可以包含其他元素.添加下面突出显示的文本,定义一个幻灯片(slide)元素,并在它内部包含一个标题(title)元素:<slideshow ... > <!-- title slide --> <slide type="all"> <title>wake up to wonderwidgets!</title> </slide> </slideshow> 这里,也给幻灯片(slide)添加了一个type 属性.该属性主要是用来标识幻灯片,是type="tech" 还是 type="exec",以便区别观众是技术人员还是管理人员,如果两种类型的观众都有那么就是使用type="all". 然而,更重要的是,该例子显示了适合定义成元素(title 元素)与适合作为属性 (type 属性)的事务之间的区别.这里主要使用可视化启发法.标题是观众能够看到的内容.所以它是一个元素.而类型是永远都不会显示出来的,所以它是属性.另一种区分方法是,元素是容器, 就像瓶子一样.类型是容器的特征(高的还是矮的,宽的还是窄的).标题是内容的特征 (水.牛奶还是茶).当然,这些都不是非常严格的规则,但是在设计自己的xml结构的时候,它们很有用.添加 html-风格文本
由于xml允许你定义任何你想定义的标签,因此可以定义一组看上去类似于html的标签.实际上这是通过xhtml标准实现的.在sax教程的结束部分,你会进一步了解它.现在,输入下面突出显示的文本,定义一个具有两个列表项目的幻灯片,这些项目使用html-风格的<em>标签进行强调 (通常使用斜体字): ... 下一页