JAXP 再述――Sun 的 Java API for XML Parsing1.1 版

2016-02-19 16:28 11 1 收藏

今天图老师小编要跟大家分享JAXP 再述――Sun 的 Java API for XML Parsing1.1 版,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - Web开发 】

  继上篇关于 JAXP(Sun 的 Java API for XML Parsing)的文章之后,在本续篇中,作者分析了对 SAX 和 DOM 标准支持进行了更新的最新版本 1.1。添加了 TRaX 之后,JAXP 1.1 为 Java 和 XML 开发人员提供了在编写对 XML 文档进行语法分析和变换的独立于供应商的代码方面不可缺少的工具。

  如果您经常阅读 developerWorks 的 XML 专区,就可能对另一篇 JAXP 文章的出现感到有些奇怪。就在一个月前,我写了一篇文章 JAXP 专述 。在那篇文章中,我完整地解释了 JAXP(Java API for XML Parsing),其工作原理,以及它如何帮助您用 Java 程序处理 XML 数据。那篇文章讲的是 JAXP 发行版 1.0。

  熟悉的领域

  那么,为什么还要写 JAXP 方面的文章呢?我是 JAXP 专家小组的成员之一,我们现在即将完成 1.1 规范。虽然大多数点发行版(指的是,例如,版本从 1.0 升到 1.1,或从 2.2 升到 2.3)只对现有的 API 作很小、或者至少是简单的改动,但是 JAXP 的 1.1 发行版却与其前一版有很大不同。事实上,本文只有三分之一讲述现有类和功能性中的新方法,而其余部分将集中讲述 JAXP 1.1 版完全新的类和功能。换句话说,JAXP 1.1 中的新东西(也是好东西)实在太多,我迫不及待地要让您感受一下它们。

  如果是 JAXP 新手,或者现在正在使用它,或者要等它再成熟一些时使用,那么,本文正适合您。我将讲述对 API 1.0 版所作的修改,然后再花一些时间讲一下 TRaX(XML 变换)。TRaX 是合并到 JAXP 中来允许用独立于供应商的方式进行 XSL 变换的 API,它补充了 JAXP 在进行 XML 语法分析时允许供应商独立性的现有能力。休息片刻,然后再读这篇 JAXP 1.1 的讨论。

  增强语法分析 API

  很多对 JAXP API 的改动都围绕语法分析进行,考虑到 JAXP 中的 "P" 代表 "parsing"(语法分析),这是有意义的。但是,JAXP 1.1 中的重大改动是围绕 XML 变换进行的,以后将在本文中介绍。在现有的 JAXP 功能性方面,改动非常少。最大的增加是对 SAX 2.0(在 2000 年 5 月完成)的支持,和对 DOM 级别 2(还在完成工作中)级别 2 的支持。前一版的 JAXP 只支持 SAX 1.0 和 DOM 级别 1。这种更新标准的缺乏曾一度是 JAXP 1.0 中最受批评之处。

  除了使 JAXP 支持 SAX 和 DOM 的最新版之外,API 中还有几处小的改动(如我上一篇文章所述)。几乎所有这些改动都是通过不同公司和个人对 JAXP 专家小组提供的反馈而产生的重要改动。所有这些改动还处理由 JAXP 的两个 factory( SAXParserFactory 和 DocumentBuilderFactory )返回的语法分析器的配置问题。现在,我将讲述这些,以及 SAX 和 DOM 标准支持中的更新。

  更新标准

  从 JAXP 1.0 到 1.1 的升级中,最令人期待的改变是对流行的 SAX 和 DOM 标准支持的更新。SAX (Simple API for XML) 在 2000 年 5 月发行了 2.0 版,与 XML 其它组件相比,该版本对 XML 名称空间的支持提供了极大增强。这种名称空间的支持允许使用众多其它 XML 词汇,如 XML 模式、XLink 和 XPointer。虽然在 SAX 1.0 中也可以使用这些词汇,但是开发人员需要将元素的本地(或限定)名称与其名称空间分开,并在整个文档中跟踪这些名称空间。SAX 2.0 为开发人员提供了这种信息,从而极大简化了执行这些编程任务的过程。DOM 级别 2 也是一样:有名称空间支持和许多 DOM 类中的其它方法。虽然 DOM 级别 2 还没有完成,但是,JAXP 1.1 支持其目前的规范。如果 DOM 标准的最终版本引入了小的改动,JAXP 当然要包括这些修改。

  好的消息是:这些改动对使用 JAXP 的开发人员来说通常都是透明的。换句话说,这些标准更新可以说是自动发生的,无需用户介入。只要对 SAXParserFactory 指定与 SAX 2.0 兼容的语法分析器,并对 DocumentBuilderFactory 类指定与 DOM 级别 2 兼容的语法分析器,就可以利用这种更新。

  通往 SAX 2.0 之路

  有几个与这些更新相关的重要改动。在 SAX 1.0 中,由供应商和 XML 语法分析器项目实现的语法分析器接口是 org.xml.sax.Parser 。然后,JAXP 类 SAXParser 通过 getParser() 方法提供一个方法来获得这个底层实现类。该方法的特征如下:

  清单 1. getParser() 方法

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  

public interface SAXParser {public org.xml.sax.Parser getParser();// Other methods}

  然而,在从 SAX 1.0 到 2.0 的改动中,反对使用 Parser 接口,并将其用新接口 org.xml.sax.XMLReader 替代。这在本质上使 getParser() 方法在获得 SAX 2.0 XMLReader 类的实例方面已无用处。为支持这种做法并支持 SAX 2.0,将一个新方法添加到 JAXP SAXParser 类。自然地,将该方法命名为 getXMLReader() ,它看起来如下:

  清单 2. getXMLReader() 方法

  

public interface SAXParser {public org.xml.sax.XMLReader getXMLReader();public org.xml.sax.Parser getParser();// Other methods}

  同样,在 SAX 1.0 中用来实现回调的类是 org.xml.sax.HandlerBase ,并将该类的实例提供给所有 JAXP 1.0 parse() 方法。但是,由于某些其它的 SAX 2.0 不支持和改动,在 SAX 2.0 中已不再使用这个类。取代它的是 org.xml.sax.ext.DefaultHandler 。为适应这种改动,为 SAXParser 类中的所有 parse() 方法补充了接受 DefaultHandler 类实例以支持 SAX 2.0 的同一方法的不同版本。为帮助您看到这一不同之处,清单 3 中显示了所讨论的方法:

  清单 3. parse() 方法

  

public interface SAXParser {// The SAX 1.0 parse methodspublic void parse(File file, HandlerBase handlerBase);public void parse(InputSource inputSource, HandlerBase handlerBase);public void parse(InputStream inputStream, HandlerBase handlerBase);public void parse(InputStream inputStream, HandlerBase handlerBase,String systemID);public void parse(String uri, HandlerBase handlerBase);// The SAX 2.0 parse methodspublic void parse(File file, DefaultHandler defaultHandler);public void parse(InputSource inputSource, DefaultHandler defaultHandler);public void parse(InputStream inputStream, DefaultHandler defaultHandler);public void parse(InputStream inputStream, DefaultHandler defaultHandler,String systemID);public void parse(String uri, DefaultHandler defaultHandler);// Other methods}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  所有这些方法都用来进行语法分析可能有点令人困惑,但是,只有在使用 SAX 的 两个 版本时才会令人感到棘手。如果正在使用 SAX 1.0,那么将使用 Parser 接口和 HandlerBase 类,应该使用哪些方法也很明显。同样,在使用 SAX 2.0 时,很明显,应该使用那些接收 DefaultHandler 实例并返回 XMLReader 的方法。因此,请把所有这些都看成是参考,不要对此太担心。另外,还对 API 的 SAX 部分作了某些其它改动。

  现有 SAX 类中的改动

  要完成对现有 JAXP 功能性改动的讨论,需要复习几个 JAXP SAX 用户可以使用的新方法。首先, SAXParserFactory 类有一个新方法: setFeature() 。如您可从 JAXP 1.0 中所回忆的一样, SAXParserFactory 类允许对从 factory 返回的 SAXParser 实例进行配置。除了已有的方法( setValidating() 和 setNamespaceAware() )之外,这个新方法允许请求新语法分析器实例的 SAX 2.0 功能。SAX 2.0 提供允许供应商为其语法分析器创建特定功能性的 功能 ,然后,用户可以与通过 SAX 与这些功能交互。例如,用户可以请求 http://apache.org/xml/features/validation/schema 功能,该功能允许将 XML 模式验证打开或关闭。现在,这可以在 SAXParserFactory 上执行,如清单 4 所示:

  清单 4. 使用 setFeature() 方法

  

SAXParserFactory myFactory = SAXParserFactory.newInstance();// Turn on XML Schema validationmyFactory.setFeature("http://apache.org/xml/features/validation/schema", true);// Now get an instance of the parser with schema validation enabledSAXParser parser = myFactory.newSAXParser();

  当然,还提供了 getFeature() 方法来补充 setFeature() 方法,并允许查询特定的功能。该方法返回一个简单的 boolean 值。

  SAX 除了允许设置功能(设置成 true 或 false 值)之外,还允许设置 特性 。在 SAX 中,特性是与实际的 Java 对象相关的名称。例如,使用 SAX 语法分析器实例,您可以设置特性 http://xml.org/sax/properties/lexical-handler ,为该特性分配一个 SAX LexicalHandler 接口的实现。然后,语法分析器将使用该实现来做词汇处理。因为象词汇这样的特性是特定于语法分析器、而不是特定于 factory 的(象特性一样),所以在 JAXP SAXParser 类中、而不是在 SAXParserFactory 类中提供 setProperty() 方法。与功能一样,也在 SAXParser 中提供 getProperty() 的补充方法,以返回与特定特性相关的值。

  DOM 中的更新

  JAXP 的 DOM 部分有一些新方法。已经将这些方法添加到现有 JAXP 类中,以同时支持 DOM 级别 2 选项,以及去年出现的一些常见配置情况。我不想在这里讲述所有这些选项及相应方法,因为它们中的很多都不易被察觉(它们只在极罕见的情况下使用),在很多应用中都不需要。当然鼓励您在最近的 JAXP 规范中联机查看这些(请参阅 参考资料 一节)。讲完了标准更新、SAX 改动和其它 DOM 方法之后,您可以阅读 JAXP 1.1 中最重要的改动 -- TRaX API 了。

  TRaX API

  目前为止,已经讲了对用 JAXP 进行 XML 语法分析的改动。现在,可以讲 JAXP 1.1 中的 XML 变换了。Sun 的 最新版 API 中最令人兴奋的进展恐怕就是它允许进行独立于供应商的 XML 文档变换。如果对 XML 变换和 XSLT(XML 变换)不熟悉,请查看 dW教程(请参阅 参考资料 )。虽然这种供应商独立性可以扩展目前 JAXP 只作为语法分析 API 的想法,但是它更是个迫切需要的设施,因为目前 XSL 处理器使用不同的方法和方式来允许用户和开发人员的交互。实际上,不同供应商的 XSL 处理器比 XML 语法分析器有更大的不同。

  最初,JAXP 专家小组试图提供一个简单的 Transform 类和几个方法,以使样式表和后面的文档变换规范化。这个最初的尝试后来被证明很不可靠,但是,我很高兴地说:我们(JAXP 专家小组)在这之后的尝试中正取得重大进展。Scott Boag 和 Michael Kay 这两位当今的 XSL 处理器专家(分别致力于 Apache Xalan 和 SAXON)已经与他人一起开发出 TRaX。它支持更广范围的选项和功能,并为几乎所有的 XML 变换提供完整的支持 -- 所有这些都在 JAXP 支持下工作。

  与 JAXP 的语法分析部分一样,执行 XML 变换需要三个基本步骤:

获得 Transformer factory 检索 Transformer 执行操作(变换)

  使用 factory

  在 JAXP 的变换部分中,使用名为 javax.xml.transform.TransformerFactory 的 factory。这个类与我在第一篇 JAXP 文章和本文前面提到的 SAXParserFactory 和 DocumentBuilderFactory 类相似。当然,只获得要使用的 factory 实例实在使太简单了:

  清单 5. 获得 TransformerFactory 实例

  

TransformerFactory factory = TransformerFactory.newInstance();

  一旦获得 factory 之后,可以在该 factory 上设置各种选项。那些选项将影响由该 factory 创建的 Transformer (稍后就要讲)的所有实例。(顺便提一句,可以通过 TransformerFactory 获得 javax.xml.transform.Templates 实例。模板是高级 JAXP 概念,本文不再详述。)

  首先可以使用的选项是 属性 。这些不是 XML 属性,而是与在 XML 语法分析器中讲到的特性类似。属性允许将选项传递到底层的 XML 处理器(可能是 Apache Xalan、SAXON 或 Oracle 的 XSL 处理器)。它们高度依赖于供应商。与 JAXP 的语法分析方面类似,还提供 setAttribute() 方法和其搭档 getAttribute() 。与 setProperty() 类似,前者接受属性名和 Object 值。与 getProperty() 类似,后者接受属性名并返回相关的 Object 值。

  设置 ErrorListener 是可用的第二个选项。 ErrorListener 在 javax.xml.transform.ErrorListener 接口中定义,它允许捕获变换中出现的问题,并在程序中处理。如果熟悉 SAX,您将发现,该接口与 org.xml.sax.ErrorHandler 接口非常类似:

  清单 6. ErrorListener 接口

  

package javax.xml.transform;public interface ErrorListener {public void warning(TransformerException exception)throws TransformerException;public void error(TransformerException exception)throws TransformerException;public void fatalError(TransformerException exception)throws TransformerException;}

  通过创建该接口的一个实现,填充三个回调方法,并在正在使用的 TransformerFactory 实例上使用 setErrorListener() 方法,您将可以处理任何错误。

  最后,提供一个方法来设置和检索由 factory 生成的实例的 URI( uniform resource indicator ,统一资源标识,通常称为 URL)解析器。在 javax.xml.transform.URIResolver 中定义的接口也与其 SAX 对应接口 org.xml.sax.EntityResolver 类似。该接口有一个方法:

  清单 7. URIResolver 接口

  

package javax.xml.transform;public interface URIResolver {public Source resolve(String href, String base)throws TransformerException;}

来源:http://www.tulaoshi.com/n/20160219/1612229.html

延伸阅读
参考书籍完成的一个可以打印一个单独JTable组件的涵数,希望对大家有所帮助. private void printTable() { Toolkit kit = Toolkit.getDefaultToolkit(); //获取工具箱 Properties props = new Properties(); props.put("awt.print.printer", &quo...
标签: Web开发
专栏作家 Uche Ogbuji 深入思考了 XMLOpen 会议上提出的几种观点,最近在英国剑桥召开的这次会议是关于 XML 处理的一次盛会。值得注意的课题包括 XML 规格、 Semantic Web、XML 管道、Web Proper Names 和数据类型。他还从实用的角度对 XML Hacks 一书作了进一步分析,上一期文章中已经详细地介绍了这部关于技巧和窍门的书籍。 XMLOpen...
现在,Java技术已经风靡全球,就连环球信息网WWW的创始人也说:“计算机行业发展的下一个浪潮就是Java,并且很快就会发生。” SUN公司也声称,J2EE 1.4代表了“迄今为止最完美的网络服务平台”。 !-- frame contents -- !-- /frame contents -- 现在,Java程序已经无处不在,就连手机都成了Java的活动舞台。2004年的二级计...
本文对Java规则引擎与其API(JSR-94)及相关实现做了较详细的介绍,对其体系结构和API应用有较详尽的描述,并指出Java规则引擎,规则语言,JSR-94的相互关系,以及JSR-94的不足之处和展望 复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决...
不正确的Swing线程是运行缓慢、无响应和不稳定的Swing应用的主要原因之一。这是许多原因造成的,从开发人员对Swing单线程模型的误解,到保证正确的线程执行的困难。即使对Swing线程进行了很多努力,应用线程逻辑也是很难理解和维护的。本文阐述了如何在开发Swing应用中使用事件驱动编程,以大大简化开发、维护,并提供高灵活性。 背景...

经验教程

908

收藏

56
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部