在web服务、业务流程管理(bpm)、企业应用集成(eai)及其他众多行动计划中,xml已经成为整个企业的一项关键技术。因此java开发人员可以预料到xml在开发性项目中将发挥越来越重要的作用。幸好jax(用于xml的java apis)中api的作用域在不断扩大,能够支持xml数据的多种处理方式。
例如,比较成熟的用于xml的java apis之一jaxp(用于处理xml的java api)为开发人员提供了处理xml数据的灵活性,他们可以插入自己喜欢的文档对象模型(dom)或用于xml的简单api(sax)解析器。oracle集团产品经理、xml倡导者mark scardina介绍说,"从开发人员的角度看,jaxp的优点之一是它被设计为'与解析器无关'的,这样,处理xml就不依赖于任何特定厂商的解析器了。" 利用jaxp,java程序员能够选择他们的解析引擎方法(dom或sax),而且知道xml文档将被进行适当的解析和处理(请参阅《高效地解析xml》,了解java应用程序的dom、sax和用于xml的流式api[stax]等解析技术的更多信息)。
不过,通过编写java来使用jaxp要求应用程序开发人员非常熟悉xml的知识。使用jaxp的开发人员必须编写代码来处理所有解析和处理过程;例如,根据需要创建dom解析器实例、使用该解析器来分析xml文档、构建dom树、在dom树中访问节点和数据并在应用程序代码中处理这些数据。与sax解析器一起使用jaxp的过程包括编写用于注册内容处理器的代码,编写用于处理解析器处理xml文档时发生的事件的回调代码,等等。简而言之,处理xml数据所需的编程逻辑对java程序员可能并不直观。
这时候jax规范中相对较新的成员jaxb(用于xml绑定的java体系结构)就能发挥作用了。jaxb是与jaxp完全不同的方法,"jaxb通过被看作'代理对象'的东西来处理xml文档--它使开发人员不必直接关注xml结构,便可创建或访问xml数据,"scardina说。开发人员不用编写代码来处理dom树,也不用编写回调方法来处理sax事件,而只需编写处理java对象的代码。
当用于适当类型的应用程序中时,jaxb可以产生更为巨大的生产力,java开发人员也更容易地使用它。"它是一种基础架构,使开发人员能够享受到xml带来的好处,而不必了解具体细节,"scardina说。 考虑jaxb的另一个原因是其作用不亚于将java对象映射到数据库结构的与对象-关系型框架的作用。例如,"就像oracle toplink产品的‘容器’管理数据库并将数据库显示为对象集一样,jaxb也把xml文档显示为对象集,"scardina说。
简而言之,jaxb为开发人员提供了一种用于创建xml文档与java对象之间的双向映射的面向对象的、基于java的方法。
b代表绑定
从高层次看,jaxb是一个由开发工具和运行时间引擎组成框架。包括oracle在内的实施者都使用带有java web服务开发人员工具包(jwsdp)的jaxb接口和类库来开发自己的jaxb兼容工具,以支持几种核心开发和运行时间活动:
绑定就是从xml模式生成java接口和类、并在运行时使用这些对象符合逻辑地将xml文档数据"绑"在相应的java类对象上的过程。(一个称为绑定编译器的jaxb兼容实用程序是一切jaxb实施的核心组件;绑定编译器是用于生成接口和类的工具。)
反编排就是创建(在内存中创建)代表xml文档内容的对象的实例的过程;从xml文档反编排数据的结果就是把这些数据封装为一个java对象。
编排是反编排相反;也就是说,java对象中的数据被封装为xml内容,以便将其输出。
使用jaxb的第一步是获得与xml文档类型相关联的xml模式文件,该类型必须是java应用支持的。xml模式是用于定义xml文档及其数据类型的xml语言,也是xml技术赋予xml数据意义及前后关系的关键。一个xml模式文件基本上就是一个用xml模式语言写成的xml文件,它定义了特定xml文档类型所允许的简单的和复杂的数据类型以及这些数据类型之间的关系(也就是说这些类型是有层次结构的)。一般来说,任何发送或接收xml文档的应用程序都需要具备一个与xml文档相关联的xml模式,以便在xml文档内容中顺利传达(由程序)数据含义。
不过,如果开发人员已经有了相应的xml模式文件,他只需将它与编译器生成程序联合使用,便可创建用于将xml文档数据绑在java对象上的java源文件。如何调用或执行绑定编译器要依具体实施过程而定;例如,oracle的绑定编译器是作为一个java可执行文件(oracle.xml.jaxb)来调用的,它将xml模式文件名(filename.xsd)作为一个参数来传递,并为输出文件提供一个目录路径名。
生成的类(java源代码文件声明为接口程序)包含目标文件filename.xsd 中定义的每一个元素的setter和getter方法;生成的类依次执行这些接口程序。"这些java类提供了一组get方法,它使我能够简单地从xml文档中我所感兴趣的那些部分中获取与其类型相绑定的值,"scardina说。
在运行时,java应用程序使用get方法从xml文档接收数据,以便从xml文档反编排数据并构建java对象(由绑定编译器生成的类的实例)。
例如,scardina说,"假如我想用web表单将采购订单作为xml数据提交给其他系统。我要获得定义元素、数据类型和采购订单结构的xml模式文件,并使用jaxb绑定编译器将xml实体绑定到接口和类当中,然后就可以从jsp调用它们了。"
根据任务选择适合的工具
和任何其他工具一样,应用程序开发人员也希望将jaxb用在最适合的地方。mark scardina介绍说,jaxb用于电子商务应用程序中时非常有效,特别是它支持在特定行业中接发商务文档(如采购订单或发票)中的xml数据的交互活动。"你不会将jaxb选作xml编辑器或类似的东西的面向创作的接口,"scardina说。"如果你正在处理xml文档--包含混合内容、半结构化或未结构化的数据,并带有段落标记和类似东西的真正的xml文档--你不大可能用jaxb来处理这样的文档。jaxb的确不适合做这种工作,这也就是为什么会出现jaxp的原因。"
此外,作为一个双向框架在不但需要读取xml数据,而且还必须修改数据、为进一步处理发送数据,或者要始终以变化后的形式送至储存库或最初的来源时,jaxb也最适合不过了。
简而言之,如果你需要从xml内容中获取数据,并把这些数据封装为java对象以便用java程序进行处理,那么jaxb为你提供了一种相对简便的方法。但是,要记住一个潜在的缺点,那就是你要为xml模式中的每一种数据类型创建java对象。
jaxb规范的另一个潜在缺点是它不对如何处理"结点顺序"进行规定,根据特定的实施过程,这可能会产生问题。scardina解释说,"xml具有文档顺序的概念,它确定了结点的顺序。这在xml规范中进行了定义,这就意味着不同的实施过程必须与这个顺序进行互操作。但是jaxb将xml文档及其数据显示为一组单独的对象,根据规范,惟一的要求就是把同组数据作为一个列表编排为xml以及从xml反编排。但是,这个列表的顺序可能不具有互操作性。"
实施oracle jaxb的好处之一就是它在后台利用了dom--当oracle的jaxb运行时间把一个xml文档反编排为java对象时,它也把多个文档绑定为一个dom结构--这样,如果必要的话,开发人员就可以重构或重调该顺序。"当你发出调用指令以获取数据时,oracle jaxb运行时间就在后台替你从dom对象中获取特定数值或字符串,而你一点都不用操心,"scardina说。
结论
支持jaxb 1.0是oracle xml开发工具包(xdk)10g的重要新特性之一。未来版本的xdk将提高java开发人员处理xml和使用oracle技术的能力,例如,通过将对jaxb定制的支持添加到oracle jaxb编译器中。同时,你现在就可以使用xdk,以一种更为友好的java方式(即使用jaxb)开始处理xml。
闽公网安备 35060202000074号