科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用 JAXP 1.3 的新功能验证 XML1

使用 JAXP 1.3 的新功能验证 XML1

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

JAXP 主要增加了新的验证 API,它提供了更好的交互性,支持 XML Schema 和 RELAX NG,能够在验证的同时即时修改。本文详细介绍这种新的 API,包括基本特性和更高级的特性。

作者:Brett McLaughlin 来源:IT专家网 2008年6月1日

关键字: XML 验证 JAXP java

  • 评论
  • 分享微博
  • 分享邮件
Java™ 编程语言的最新版本 Java 5.0 包括经过改进和扩展的 Java API for XML Processing(JAXP)版本。JAXP 主要增加了新的验证 API,它提供了更好的交互性,支持 XML Schema 和 RELAX NG,能够在验证的同时即时修改。经过这些改进,为 Java 开发人员提供了一种工业强度的 XML 验证解决方案。本文详细介绍这种新的 API,包括基本特性和更高级的特性。

  几年来,Java API for XML Processing(JAXP)一直是一种稳定、有点儿沉闷的 API。这并不是坏事。沉闷常常意味着可靠,对软件来说总是好事。不过 JAXP 的迟钝已经让开发人员不再寻求新的特性。从 Java 1.3 到 1.4,除了支持最新版本的 SAX 和 DOM 规范以外,JAXP 没有很大变化。但是在 Java 5.0 和 JAXP 1.3 中,Sun 大大扩展了 JAXP。除了支持 XPath 以外,最值得一提的还有验证。本文详细介绍了 JAXP 1.3 的验证特性,该特性在 javax.xml.validation 包中实现。

  简要的历史回顾

  详细了解这种验证 API 的具体细节之前,必须充分了解 JAXP 1.3 之前验证是如何完成的。此外,显然 Sun 仍将支持过去的 DTD 验证方法,但是建议使用基于模式的新的验证 API。因此即便您义无反顾地要使用 javax.xml.validation 包,仍然需要理解使用 DTD 验证文档的方法。

  本文中(而且一般来说),模式(schema) 指的是跟随一种 XML 格式的任何约束模型。XML Schema 是一种模式,但模式不一定是 XML Schema(按照 W3C 规范的定义)。比如,模式 也可用于 RELAX NG 模式。使用一般意义的 模式 更便于指称某种特定的方法(基于 XML 的约束模型)而不局限于具体的实现。

  创建解析器工厂

  在一般的 JAXP 处理中,都是从 工厂 开始的。SAXParserFactory 用于 SAX 解析,DocumentBuilderFactory 则用于 DOM 解析。这两种工厂都使用静态方法 newInstance() 创建,如清单 1 所示。

  清单 1. 创建 SAXParserFactory 和 DocumentBuilderFactory

// Create a new SAX Parser factory
SAXParserFactory factory = SAXParserFactory.newInstance();

// Create a new DOM Document Builder factory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

  打开验证

  虽然 SAXParserFactory 和 DocumentBuilderFactory 有分别适合 SAX 和 DOM 的不同特性和性质,但是对验证来说它们都有一个共同的方法:setValidating()。如您所料,要打开验证,只需要把 true 传递给该方法。但是使用工厂是为了创建解析器而不是直接解析文档。创建工厂之后就可以调用 newSAXParser()(SAX)或 newDocumentBuilder()(DOM)。

  对工厂设置的选项影响该工厂创建的所有解析器。如果用 true 调用 setValidating(),则明确地告诉工厂创建的所有解析器都必须是进行验证的。要记住,很容易出现这种情况:在工厂中打开验证,在写了 100 行代码之后忘了这个设置,也就忘了生成的解析器是进行验证的。

  清单 2 显示了这两个方法,都打开了验证。

  清单 2. 打开验证(DTD)

// Create a new SAX Parser factory
SAXParserFactory factory = SAXParserFactory.newInstance();

// Turn on validation
factory.setValidating(true);

// Create a validating SAX parser instance
SAXParser parser = factory.newSAXParser();

// Create a new DOM Document Builder factory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

// Turn on validation
factory.setValidating(true);

// Create a validating DOM parser
DocumentBuilder builder = factory.newDocumentBuilder();

  无论哪种情况,都将得到一个能够解析 XML 并在解析过程中验证 XML 的对象(SAXParser 或 DocumentBuilder)。但是要记住,这样做 仅 限于 DTD 解析。setValidating(true) 调用对基于 XML 的解析完全没有作用。

javax.xml.validation 简介

  5 年前,用一个漂亮的方法打开 DTD 验证就足够了。甚至两年前,XML Schema 和 RELAX NG 之类的模式语言仍然在忙于解决自己的问题。但今天,用模式验证文档与 DTD 方式一样常见。这两种方法同时存在很大程度上是因为遗留文档仍然使用 DTD。今后几年内,DTD 将和 Lisp 一样消失,成为历史遗迹而不是主流技术。

  JAXP 1.3 通过引入 javax.xml.validation 包支持模式验证已经在开发人员中引起了很大反响。这个包易于使用,结构紧凑,已经成为 Java 语言的标准组成部分。更好的是,如果您曾经通过 JAXP 使用过 SAX 和 DOM,那么掌握如何验证就更简单了。模型是类似的,您会发现使用这种 API 进行验证简直轻而易举。

  使用 SchemaFactory

  通过 简要的历史回顾 您知道,使用 SAX 的第一步是创建新的 SAXParserFactory。如果使用 DOM 则首先创建 DocumentBuilderFactory。因此毫不奇怪,进行模式验证首先要创建 SchemaFactory 类的实例,如清单 3 所示。

  清单 3. 创建 SchemaFactory

import javax.xml.XMLConstants;
import javax.xml.validation.SchemaFactory;

...

SchemaFactory schemaFactory =
      SchemaFactory.newInstance(XMLConstants.W3C_SCHEMA_NS_URI);

  这和其他工厂的创建类似,只不过增加了传递给 newInstance() 方法的参数。必须向该方法传递另一个类中定义的常量,即 javax.xml.XMLConstants 类,对这个类也需要非常熟悉。这个类定义了 JAXP 应用程序中使用的所有常量,不过现在只需要知道两个:

  用于 RELAX NG 模式的 XMLConstants.RELAXNG_NS_URI

  用于 W3C XML Schema 的 XMLConstants.W3C_XML_SCHEMA_NS_URI

  因为 SchemaFactory 是与具体的约束模型联系在一起的,所以必须在工厂构造的时候提供这个值。

  SchemaFactory 类还有其他几个选项。对于一般的 XML 验证,预设的工厂就够了。

  针对模式进行验证

  建立工厂后还需要装入需要使用的约束集。可以通过工厂的 newSchema() 方法来完成。但是工厂以 javax.xml.transform.Source 实现作为输入,因此需要一个中间步骤:将模式转化成 Source 表示。这个过程很简单,如清单 4 所示。

  清单 4. 从约束到 Schema

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Schema;

...

SchemaFactory schemaFactory =
     SchemaFactory.newInstance(XMLConstants.W3C_SCHEMA_NS_URI);
Source schemaSource =
     new StreamSource(new File("constraints.xml"));
Schema schema = schemaFactory.newSchema(schemaSource);

  如果熟悉 JAXP,那么这些代码都非常直观。清单 4 中加载了一个名为 constraints.xml 的文件。可以使用任何方法得到 Source 中的数据,包括使用 SAX 或 DOM(分别通过 SAXSource 和 DOMSource)读取约束,甚至使用 URL。

 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章