利用Java技术进行XML编程,第2部分

    技术2022-05-11  5

    简介

     

     

    关于本教程

    上一篇教程(“ 利用 Java 技术进行 XML 编程,第 1 部分”)中,我介绍了在 Java 语言中解析 XML 的基本知识,讨论了主要的 API(DOM、SAX 和 JDOM),然后通过一些示例说明了多数 XML 应用程序中常见的基本任务。本教程将考察以前没有涉及到的更加困难的工作,比如:

    读取和设置解析器特性 使用名称空间 验证 XML 文档

    在那篇入门教程中谈到的 API 有:

    文档对象模型(DOM),Levels 1、Levels 2 和 Levels 3 Simple API for XML (SAX),Version 2.0 JDOM,由 Jason Hunter 和 Brett McLaughli 创建的一种简单 Java APIn Java API for XML Processing (JAXP)

    我还将讨论几种验证方法,其中包括 W3C XML Schema、RELAX NG 和 Schematron。

     

     

     

    关于本文中的示例 这里的多数示例都使用上一篇教程中出现的莎士比亚十四行诗。该十四行诗的结构如下: <sonnet> <author> <lastName> <firstName> <nationality> <yearOfBirth> <yearOfDeath> </author> <lines> [14 <line> elements] </lines> </sonnet>

    在文中的不同示例中,该文档的一些版本使用名称空间,而另一些则使用 DTD、W3C XML Schemas 或者其他的验证模式语言。完整示例请参阅以下文件:

    sonnet.xml sonnet.dtd(下载后在文本编辑器中查看) sonnetNamespaces.xml sonnet.xsd sonnetSchema.xml sonnet.rng sonnetRules.xsl sonnetSchematron.xml

    您还可以下载这些文件 ,在文本编辑器中查看它们。

     

     

     

    设置机器

    运行这些例子之前需要对您的机器做一些设置(假设您知道如何编译和运行 Java 程序,也知道如何设置 CLASSPATH 变量)。

    首先请访问 Apache XML Project(http://xml.apache.org/xerces2-j)上的 Xerces XML 解析器主页,您也可以直接进入下载页面(http://xml.apache.org/xerces2-j/download.cgi)。 对从 Apache 下载的文件进行解压缩,这将创建一个名为 xerces-2_5_0 或者类似名称的(取决于解析器的版本)目录。您所需要的 JAR 文件(xercesImpl.jarxml-apis.jar)应该在 Xerces 根目录中。 请访问 JDOM 项目网站 并下载最新版本的 JDOM(http://jdom.org/)。 对从 JDOM 下载的文件进行解压缩,创建名为 jdom-b9 或者类似名称的目录。您所需要的 JAR 文件(jdom.jar)应该在 build 目录中。 最后请下载本教程所用的样例文件压缩包 ,并对其进行解压缩。 将当前目录(.)、xercesImpl.jarxml-apis.jarjdom.jar 添加到 CLASSPATH 中。

     

     

    关于作者

    最早的 13 个殖民地之一,“花园之州”新泽西是七百多万人的家园。熙熙攘攘,充满活力,它具有非凡的多样性,从特伦顿的田园风味的山丘到与纽约以及费城毗邻的市区。新泽西州以其自然遗产而自豪,近年来因为其丰富的野生动植物资源而备受尊崇,比如贝壳娥螺(新州的州贝)和东方金翅雀(新州的州鸟)。

    新泽西州也以其对现代交通的长期支持而闻名。境内的特拉华河和哈德逊河是这个国家最初的两条高速公路,时至今日,它的 Turnpike 是这个国家最繁忙的公路。它对现代技术的热衷,从最先允许城市使用停车付费卡和在线购买捕鱼许可证可见一斑。您可以通过 dtidwell@us.ibm.com 与作者联系,或者访问他的网站 www.state.nj.us

     

     

     

     

    读取和设置解析器特性

     

     

    解析器特性

    随着 XML 变得越来越复杂,解析器也变得越来越复杂。DOM、SAX 和 JDOM 都定义了一些解析器特性。其中有些特性是必须的,有些则是可选的。这三种 API 都为解析器特性的读取和设置提供了类似的方法和异常。

    拿 SAX 来说吧,SAX API 本身在 XMLReader 接口中定义了读取和设置解析器特性的方法。JAXP 也在 SAXParserFactorySAXParser 类中提供了相同的方法。下面的代码就使用了这些方法:

    public static void checkFeatures() { try { SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setFeature ("http://xml.org/sax/features/namespace-prefixes", true); if (!spf.getFeature ("http://xml.org/sax/features/validation")) spf.setFeature ("http://xml.org/sax/features/validation", true); . . . }

    除了 getFeature()setFeature() 方法之外, JAXP 还定义了处理常用的名称空间和验证特性的方法。SAXParserFactory 类定义了 setNamespaceAware()setValidating() 方法,在创建的任何 SAXParser 上设置这些特性。此外,SAXParserFactorySAXParser 都提供了 isNamespaceAware()isValidating() 方法。

     

     

     

    设置 SAX 解析器特性

    在设置 SAX 特性的 getFeature()setFeature() 方法中我留下了一个细节:处理异常。在设置 SAX 解析器特性时,一定要捕获两种异常: SAXNotSupportedExceptionSAXNotRecognizedException

    catch (SAXNotSupportedException snse) { System.out.println ("The feature you requested is not supported."); } catch (SAXNotRecognizedException snre) { System.out.println ("The feature you requested is not recognized."); }

    SAXNotSupportedException 表示解析器可以识别出请求的特性,但是不支持它,而 SAXNotRecognizedException 表示解析器根本没有听说过所要求的特性。

     

     

     

    SAX 解析器特性

    SAX 2.0 标准要求解析器能够识别以下两种特性:

    http://xml.org/sax/features/namespaces 解析器识别名称空间:如果该属性为 true,所有的元素和属性都可以使用名称空间 URI 和未限定的本地名。任何 SAX 2.0 兼容的解析器必须支持将该属性的默认值设为 true http://xml.org/sax/features/namespace-prefixes 解析器对名称空间前缀的解析提供支持。当该属性设为 true 时,元素和属性可以使用名称空间前缀,包括 xmlns: 属性。任何 SAX 2.0 兼容的解析器都必须支持将该属性的默认值设为 false

    关于这两必备特性的另外一点是:解析器必须提供它们的 get 方法,但不一定提供 set 方法。

    为了帮助您避免造成 SAXNotRecognizedException 异常,下面列出了常见的支持特性。在 SAX 2.0 标准中没有定义这些特性(标准只定义了两种必备特性)。SAX 解析器不一定要支持或者识别下述任何一种特性,任何给定的解析器都可以增加其他专有的特性。

    http://xml.org/sax/features/external-general-entities 决定解析器是否处理外部通用实体。该特性没有默认值,虽然在启用验证时该特性被设为 true http://xml.org/sax/features/external-parameter-entities 决定解析器是否处理外部参数实体。该特性没有默认值,虽然在启用验证时该属性被设为 true http://xml.org/sax/features/is-standalone 该属性定义 XML 声明是否包含 standalone="yes"。不能修改、只能查询该属性,而且只能在 startDocument 事件之后查询。 http://xml.org/sax/features/lexical-handler/parameter-entities SAX 解析器的 LexicalHandler 将报告参数实体的开始和结束。 http://xml.org/sax/features/resolve-dtd-uris 若值为 true,表明定义声明的 SYSTEM ID 将以相对于文档基 URI 的形式给出; false 则表明 ID 是按照文档中出现的形式给出的。程序中可以使用 Locator.getSystemId() 方法获得文档的基准 URI。 http://xml.org/sax/features/string-interning 如果将该属性设为 true,那么就会使用 java.lang.String.intern() 将所有的 XML 名字和名称空间 URI 都“拘禁”(intern)起来。与调用 java.lang.String.equals() 相比,使用 intern() 能使字符串的比较更快。 http://xml.org/sax/features/use-attributes2 http://xml.org/sax/features/use-locator2 http://xml.org/sax/features/use-entity-resolver2 若值为 true,即表明解析器使用更新后的接口,它们分别是 org.xml.sax.ext.Attributes2org.xml.sax.ext.Locator2org.xml.sax.ext.EntityResolver2 http://xml.org/sax/features/validation 规定解析器是否验证文档。若为 true,则 external-general-entitiesexternal-parameter-entities 也自动被设为 true http://xml.org/sax/features/xmlns-uris 如果设置了 namespace-prefixes 特性,可以使用该特性来控制名称空间声明是否在名称空间之中。 Namespaces in XML 规范规定名称空间声明不在任何名称空间之中,而 DOM Level 1 规范将名称空间声明放在名称空间 http://www.w3.org/2000/xmlns/ 中。如果该特性为 true,则名称空间声明在名称空间中,如果设为 false 则不在名称空间中。

    您可以在 saxproject.org/apidoc/org/xml/sax/package-summary.html 找到所有已经定义的特性 URI 的列表。

     

     

     

    关于实体的简要说明

    有很多解析器特性都与实体及其处理有关。我在这里对实体作一简要的说明,因为有些读者可能不太熟悉。总的来说,实体定义了在处理 XML 文档的过程中将被其他事物代替的字符串。下面分别介绍不同类型的实体。

    一般实体和参数实体: 一般实体定义了在 XML 文档内部使用的置换,而参数实体只出现在 DTD 中,定义了仅能在 DTD 内部使用的置换。(DTD 后面还要介绍。)一般实体如下所示:

    <!ENTITY corp "International Business Machines Corporation">

    通过这个实体定义,字符串 &corp; 出现的地方都被替换为字符串 International Business Machines Corporation

    参数实体如下所示:

    <!DOCTYPE article [ <!ENTITY % basic "a|b|code|dl|i|ol|ul|#PCDATA"> <!ELEMENT body (
    转载请注明原文地址: https://ibbs.8miu.com/read-1050169.html

    最新回复(0)

    网站备案:渝ICP备

    网站建议:179001057@qq.com

    CopyRight © 2010-至今 All Rights Reserved
    Processed: 0.012, SQL: 8