530 likes | 709 Views
第六讲 XML 在 Java 中的应用. JAXP 、 JAX-RPC 与 JAXR. 本节内容. 用于 XML 处理 的 Java API (JAXP) 基于 XML RPC 的 Java API (JAX-RPC) 用于 XML 注册 的 Java API (JAXR). 1. JAXP. JAXP(Java API for XML Parsing) , Sun 公司用来 解析 XML 的 API , 利用 Java 程序设计语言编写的应用程序来处理 XML 数据。
E N D
第六讲 XML在Java中的应用 JAXP、JAX-RPC与JAXR
本节内容 • 用于XML处理的Java API (JAXP) • 基于XML RPC的Java API (JAX-RPC) • 用于XML注册的Java API (JAXR)
1. JAXP • JAXP(Java API for XML Parsing),Sun公司用来解析XML的API,利用Java程序设计语言编写的应用程序来处理XML数据。 • 通过使用这个API可以在解析XML文档时候不必明确地指出XML解析器类的名字,从而使写出的Java代码具有可移植性。 • JAXP 与 Sun 的语法分析器一起提供,以便可以立即使用。
JAXP(续) • JAXP支持解析器标准SAX和DOM,以事件流的形式解析数据,或者建立数据的对象表示。 • JAXP还支持XSLT标准,以控制数据的表示并且将数据转换成其他格式,如HTML 。 • JAXP还提供名称空间支持,允许使用可能产生名称冲突的DTD 。
JAXP(续) • JAXP API 主要定义在javax.xml.parsers标准扩展包,含有3个与供应商无关的工厂类。
JAXP API • SAXParseFactory工厂类,提供了一个SAXParse 。 • DocumentBuilderFactory工厂类,提供了一个DocumentBuilder,又创建依从DOM的Document对象。 • TransformerFactory工厂类,提供了一个XSLT转换器。
JAXP API(续) • 工厂API允许插入其他供应商提供的XML实现,而不用修改自己的源代码。 • 得到的实现取决于 java.xml.parsers.SAXParseFactory, java.xml.parsers.DocumentBuilderFactory, java.xml.transform.TransformerFactory 系统属性的设置。
JAXP库 • SAX API • DOM API • XSLT API
定义SAX和DOM API的库 • javax.xml.parsers 这是JAXP API,为不同供应商提供的SAX和DOM解析器提供通用接口。 • org.w3c.dom 定义Document类(一个DOM)以及对应于一个DOM的所有组件的类。 • org.xml.sax 由XML-DEV组定义的基本SAX API 。 • javax.xml.transform 定义XSLT API,通过这些API可以将XML转换成其他格式。
用于XML的简单API:SAX • SAX是一种事件驱动、串行访问XML文档的机制,它一个接一个地处理元素。 • 是面向状态无关处理的,对某一元素的处理与其前面的元素无关。 • 是目前处理XML文档可用机制中最快并且所需内存最少的一种。
用于XML的简单API:SAX(续) • SAX API适宜于服务器端和高性能的应用程序,以及数据过滤器,因为它们需要在内存中有数据的表示。 • 是需要传送和接收XML文档的servlet和面向网络的程序经常使用的。
用于XML的简单API:SAX(续) • SAX是事件驱动模型,因此很难实现可视化。 • 设置程序使用SAX比设置使用DOM需要做更多的工作。
何时使用SAX • 当想把现有的数据转换成XML时,理解SAX事件模型非常有用。 • SAX速度快而且效率高,但其事件模型对于状态无关这样的过滤器最有用。 • SAX不构建XML数据的内部表示(树结构),SAX对内存的要求比DOM小。
何时使用SAX(续) • 对于状态相关的处理,Streaming API for XML(StAX)拉式解析器可能是更好的选择。 • 如果只是简单地读取数据并在此基础上运行应用程序,使用类似于串行I/O流的拉式解析器和SAX API 。 • 当需要交互修改XML结构的时候,使用内存中结构更有意义,DOM是这样的一个模型,但需要进行复杂的编码。
SAX解析API的基本概要图 • 图略
SAX解析API的基本概要图(续) • 使用一个SAXParserFactory类的实例来生成一个解析器实例。 • 该解析器包装了一个SAXReader对象,当解析器的parse()方法被调用时,阅读器调用该应用程序中实现的若干回调方法之一,这些方法由ContentHandler、ErrorHandler、DTDHandlerResolver接口定义。
Simple API for XML (SAX) API • SAXParserFactory 根据系统特性,创建一个解析器实例。 • SAXParser 定义了若干种Parser()方法。 • SAXReader 包装于SAXParser,与SAX事件处理器进行通信。
Simple API for XML (SAX) API(续) • DefaultHandler 实现ContentHandler、ErrorHandler、DTDHandler和EntityResolver接口。 • ContentHandler 在识别XML标签时, startDocument、endDocument、startElement以及endElement等方法将被调用,这一接口还定义了characters和processingInstruction方法。
Simple API for XML (SAX) API(续) • ErrorHandler 调用error、fatalError以及warning等方法响应各种解析错误。 • DTDHandler 在处理DTD时,用于识别和作为一个未解析实体的声明。 • EntityResolver 当解析器必须识别由URI标识的数据时,调用resolveEntity方法。
SAX包 • org.xml.sax 定义SAX接口。 • org.xml.sax.ext 定义SAX扩展名,用于进行复杂的SAX处理。 • org.xml.sax.helpers 含有助手类,以使SAX更方便使用。 • javax.xml.parsers 定义SAXParserFactory类,返回SAXParser,并定义用于报告错误的异常类。
文档对象模型:DOM • DOM是一个普通的树型结构,其中的每个节点包含XML结构的一个组件。 • 最常见的节点类型是元素节点和文本节点。 • 在DOM中Text节点位于元素节点下,而数据始终存储在文本节点中。
何时使用DOM • JAXP 1.2实现支持XML Schema,这对于任何给定应用程序可能是一个重要的考虑因素。 • DOM是为文档设计的。 • 使用DOM,可以轻松创建所需要的语法结构。
何时使用DOM (续) • 对于成熟的文档和复杂的应用程序,如果需要使用XML架构。 • 如果在开发的应用程序中同时处理文档和数据。 • 如果需要从XML数据构建对象树,以便在应用程序中处理它,或者将内存中的对象树转换成XML 。
何时使用DOM (续) • DOM标准是针对内存中文档模型的成文标准,对需要将由于API的修改而造成的费用降至最低限度的大型应用程序尤为适用。 • 选择DOM会使应用程序更易于满足未来的需要。
DOM中的文档模型与JDOM中的数据模型主要区别 • 存在于层次结构中的节点种类(构成节点的方式) 。 • “混合内容”的能力(文本和元素) 。
DOM API • 一种更容易使用的API 。 • 提供一种对象的树型结构,来处理其封装的应用程序对象的层次。 • 对于交互式应用程序,DOM API相当理想,因为整个对象模型都在内存中,可由用户直接访问和处理。 • 构造DOM要求读取整个XML结构并且将对象树保存在内存中,CPU和内存资源的开销较大。
DOM API 图 • 图略
DOM包 • org.w3c.dom 按照W3C的规定,为XML或HTML文档定义DOM编程接口。 • javax.xml.parsers 定义DocumentBuilderFactor类和DocumentBuilder类,返回一个实现W3C Document接口的对象,还定义了ParserConfigurationException类,用于报告错误。
可扩展样式表语言转换:XSLT • 定义了寻址XML数据(XPath)和指定数据转换的机制,以便将数据转换为其他形式(HTML、纯文本等),或者将遗留数据结构转换成XML 。 • JAXP包括了XSLT的一个解释实现,称为Xalan。 • 一种允许在碰到某个特殊元素时,指定完成何种工作的语言。
XSL主要子部件 • XSL-FO Formatting Object标准最大的子部件,提供了描述字体大小、页面布局和对象显示的其他方面的机制。 • XSLT • XPath 一种解决机制,允许指定通向某个元素的路径,以描述不同种类的转换。
JAXP转换包 • javax.xml.transform 定义为了获得Transformer对象而使用的工厂类。 • javax.xml.transform.dom 定义DOMSource和DOMResult类。 • javax.xml.transform.sax 定义SAXSource和SAXResult类。 • javax.xml.transform.stream 定义StreamSource和StreamResult类。
XPath规范所定义抽象文档模型节点类型 • Root • Element • Text • Attribute • Comment • Processing instruction • Namespace XSLT/XPath数据模型由一个包含各种节点的树组成
XSLT API • 在javax.xml.transform中定义。 • 允许将XML数据写入到一个文件中,或者将其转换成其他格式。 • 还可以一起使用XSLT与SAX API,将遗留数据转换成XML。
XSLT API(续) • 图略
XSLT 包 • javax.xml.transform 定义TransformerFactory类和Transformer类,以得到能够进行转换的对象。 • javax.xml.transform.dom 从DOM创建输入(源)和输出(结果)对象的类。 • javax.xml.transform.sax 从SAX解析器创建输入(源)对象,从SAX事件处理器创建输出(结果)对象的类。 • javax.xml.transform.stream 从I/O流创建输入(源)对象和输出(结果)对象的类。
2. JAX-RPC • 基于XML的RPC的Java API 。 • 一种用于构建使用RPC和XML的Web服务和客户端的技术。 • 常用于分布式客户-服务器模型,一种支持客户端执行其他系统上的过程的RPC机制。 • 在JAX-RPC中,一个远程过程调用由一个诸如SOAP这样的基于XML的协议表示, JAX-RPC API为应用程序开发人员隐藏了SOAP的复杂性。
JAX-RPC(续) • 利用JAX-RPC,客户端和Web服务拥有Java编程语言的平台独立性。 • 一个JAX-RPC客户端可以访问一个并非运行在Java平台上的Web服务,反之亦然。 JAX-RPC使用由W3C规定的HTTP、SOAP和WSDL等技术
JAX-RPC(续) • 图略 JAX-RPC Web服务和客户端之间的通信
JAX-RPC支持的类型 • JAX-RPC将Java编程语言的类型映射到XML/WSDL定义上。 • 在J2SE中,不是所有的类都能作为JAX-RPC中的一个方法参数或返回值。
JAX-RPC支持的类型(续) • JAX-RPC所支持J2SE SDK类: java.lang.Boolean java.lang.Byte java.math.BigDecimal java.math.BigInteger java.net.URI java.util.Date ………
JAX-RPC支持的类型(续) • JAX-RPC所支持Java编程语言基元类型: boolean byte double float int long short
JAX-RPC支持的类型(续) • JAX-RPC还支持数组,只要数组中元素的类型是它所支持的。 • JAX-RPC还支持值类型。 • JAX-RPC也支持JavaBeans组件, JavaBeans组件必须针对每个bean属性有一个getter和setter方法,bean属性的类型必须是JAX-RPC所支持的类型。 值类型是一种其状态可在客户端和远程服务间作为方法参数或返回值传递的类
Web服务互操作性和JAX-RPC • JAX-RPC 1.1支持Web Services Interoperability (WS-I) Basic Profile Version 1.0、Working Group Approval Draft 。 WS-I Basic Profile 是一个文档,用于阐明SOAP 1.1和WSDL 1.1规范,以便提高SOAP的互操作性
3. JAXR • 用于XML注册的统一、标准的Java API 。 • XML注册是一个基础结构,用于构建、部署和发现Web服务,是一种能够促进动态和松耦合B2B交互的中性第三方,可作为共享资源供组织使用,提供的形式通常为基于Web的服务。 • 允许使用单个便于使用的抽象API访问多种XML注册。
JAXR (续) • 赋予程序员编写能够跨越各种目标注册移植的注册客户端程序的能力。 • JAXR规范的当前版本包括JAXR信息模型与ebXML Registry和UDDI Version 2之间的详细绑定信息。
JAXR体系结构 • JAXR客户端 一个使用JAXR API通过JAXR提供者访问业务注册的客户端程序。 • JAXR提供者 一种JAXR API实现,提供对特定注册提供者或基于通用规范的注册提供者类的访问。
JAXR体系结构(续) • 图略 JAXR体系结构
JAXR提供者主要程序包 • javax.xml.registry 由定义注册访问接口的API和类组成,最基本接口是Connection、RegistryService、BusinessQueryManager和BusinessLifeCycleManager 。 • javax.xml.registry.infomodel 由为JAXR定义信息模型的接口组成,RegistryObject是基本的接口,其子接口又包括Organization、Service和ServiceBinding 。
在JAXR客户端使用分类法 • JAXR客户端是可以使用JAXR API访问注册的客户端程序。 • 在JAXR API中,分类法由Classification Scheme对象表示。
在J2EE应用程序中使用JAXR客户端 • 可以创建使用JAXR客户端访问注册的J2EE应用程序。 • 使用JAXR将组织发布到注册的J2EE应用程序。 • 查询注册以获取组织。