引言
XML Catalog 实现了根据 XSD 实时校验 XML 文件的功能。用户不用编写程序,通过少量的配置就可以在编辑 XML 文件的时候得到及时的反馈(需要在 XML 编辑器进行文件的编写),实现了实时的校验。 然而在实际应用中,由于环境的不同以及 XML 文件本身的不同,手动方式的配置并不能满足需求。比如,作者在实践中发现,在开发环境里手动配置的 XML Catalog 是不能保存在运行环境的。而且,许多实际的 XML 的编写方式并没有采用标准的格式,这也给 XML Catalog 的使用带来了很多的不便。 本文针对以上问题,通过例子来说明如何通过扩展 XML Catalog 来实现基于 xsd 对 XML 文件的自动化实时校验。 XML Catalog 介绍 XML Catalog 是基于 OASIS XML Catalog specification 标准的实现,它提出了一些关于 XML 文件如何引用外部资源的控制。Eclipse 的 WTP 提供了 XML Catalog 的功能,实现利用 schema 对 xml 文件的实时校验功能。XML Catalog 是由来自一个或者多个 catalog 条目文件的条目组成的 xml 文件,其保存了要校验的 xml 文件以及该文件对应的 xsd 文件的映射,在运行时可以自动将它们关联起来,从而实现对 xml 文件的校验。 下面通过一个例子来说明 XML catalog 的相关概念。 XML Catalog 相关概念介绍
DOCTYPE 表示这个文件是 OASIS XML catalog 文件。如果没有 Internet 连接,那么,整个 DOCTYPE 的声明需要删除或者注释掉。因为 catalog 处理器会尝试从网络去下载 catalog.dtd 文件,显然在没有网络的环境下,处理器因为找不到文件会报错。 catalog 元素包含了 catalog 的内容和 catalog 的命名空间标识。 group 元素是一个包装元素,可以设置在这个组里面包含的所有 catalog 条目的属性。属性 prefer="public" 指出 catalog resolver(解析器) 在使用 SYSTEM 标识符之前优先使用 PUBLIC 标识符。属性 xml:base 表明,所有 URI 都是相对这个路径。本例中,uri="docbook45/docbookx.dtd"/ 是个相对路径,绝对路径应该是 file:///usr/share/xml/ docbook45/docbookx.dtd "。 public 元素将 publicId 映射到 uri 的路径。publicId 是资源的一个唯一标识,通常是该文件的命名空间 . system 元素将 systemId 映射到 uri 的路径。systemId 与 publicId 一样,也是资源的唯一标识,通常是资源文件在文件系统的全路径。 XML Catalog 原理 XML Catalog 提供了一种重新定位资源的机制,可以将 xml 引用的 artifacts,包括 URI 地址以及 namespace 名重新定位到另一个地址。通常这种机制被用来将远程的引用资源重定位到本地或者 web。XML catalog 就是一个描述外部实体引用和本地缓存的相同实体的映射的文件。 在实际的开发生产中,xml 文件经常会引用外部的文件,这些文件通常通过 URI 表示,其中以 URL 应用最广。但是如果是绝对的 URL, 那么只有当你的网络能够访问它时才能起作用,如果网络出现问题,那么将不能访问。当是相对 URL 时,例如"../../xml/dtd/docbookx.xml",只有当你的文件系统和定义者一致的时候才能起作用。 一种解决办法就是通过实体解析器(Entity Resolver)或者是 URI 解析器 (URI Resolver ),解析器可以通过检查资源的 URI 来定位资源。 用户通过配置 xml catalog, 手动的指定 xml 文件引用的 xsd 文件的本地地址,URI 解析器通过 xml catalog 里面的映射,找到对应的 xsd, 最后 xml catalog 处理器通过解析器找到的 xsd 对 xml 进行校验。 通俗点说,XML catalog 通过命名空间将 xml 文件及其对应的 xsd 文件联系起来,并通过解析器定位 xsd 文件的位置,最后通过处理器进行校验。 与 javax.xml.validation 通过 xsd 对 xml 进行校验的方法不同,xml catalog 可以通过 Namespace 来校验所有引用这个 xsd 的 xml 文件,从而达到批量校验的效果。例如,a.xml,b.xml,c.xml 都是由 d.xsd 校验,那么只要将 d.xsd 的命名空间配置好,通过该命名空间就可以校验以上三个文件了。 手动方式配置 XML Catalog 手动配置 XML Catalog 比较简单也比较容易理解,可以在 Eclipse 的开发环境中直接进行。选择 File -> New -> Other -> Examples -> Editing and Validating XML files,便可以进行配置了。如下图所示: 图 1. 打开 XML Catalog 的配置界面 从图 1 中可以看到有两种 xml catalog entity , 用户定义的实体及插件的实体。用手动方式生成的配置属于用户配置的实体。 图 2. 新建一个 XML Catalog Entry 新建一个 XML Catalog Entry 中的 Location 指明了 xsd 文件的位置,在这里我们选择来源于工作空间。 图 3. 从工作空间选择 student.xsd 文件 选择 OK 以后,XML Catalog Entry 就创建完成了。XML Catalog 会自动填写其他两个属性,如下图所示。 图 4. 完整的 XML Catalog Entry 如图所示,Location 标签指定了 xsd 的位置,在这里是工作空间的相对路径;Key Type 标签表明了在这里我们使用的是命名空间的名字作为 xml 和 xsd 的关联;Key 标签的值是 xml 命名空间的值。 图 5. 完整的 XML Catalog Entry 从图 5 中可以看出,新建的 XML Catalog Entry 已经在 User Specified Entries 目录下。图 1 到 4 显示了 XML Catalog 的手动配置步骤。下面,我们在 XML 编辑器里打开一个 xml 文件,看一下 XML Catalog 的功能。 图 6. 正确的 XML 文件 首先,用 XML 编辑器打开 sample.xml 文件。 图 7. XML Catalog 的实时校验结果 将 name 为 BB 的学生的 age 标签去调,从图中可以看到在编辑器的右边有一个红色的点,同时在 student 元素下面有个红色的波浪线,提示 student 元素有错误。这是,将鼠标移到 student 元素上,可以看到具体的提示信息,student 元素不完整,缺少 age 元素。 可以看出,应用 XML Catalog 对 xml 文件进行实时校验,配置步骤比较简单,只需提供相应的 xsd 文件及位置,就能将他们关联起来,实现自动的校验。 扩展 XML Catalog Contributions 在实践中发现,如果通过上一节介绍的手动方式在 Eclipse 开发环境配置 xml catalog,那么这些配置并不会在运行环境生效。然而通常情况下,我们需要的是运行环境的配置。比如我们要开发一些小工具,可以让用户编辑 xml 文件,同时我们内置了一些 xsd 文件来校验用户编辑的 xml 文件是不是正确。因为不能让用户在使用产品的时候再重新配置(因为对用户来说,他们并不需要知道这些 xsd 的存在,还有就是,不能增加用户的负担)。所以,我们需要在开发环境配置好 xsd 的信息,并让这些配置在运行时生效。通过调研,我们发现,如果要在运行环境中直接使用开发环境的配置,那么需要扩展 xml catalog Contributions 这个扩展点。 下面我们就一步步的演示如何在 Eclipse 插件里扩展 XML Catalog Contributions 扩展点。 1.打开 plugin.xml 文件的 Extensions 标签,点击 Add 按钮,添加扩展点。 图 8. 添加扩展点 2.在 Extension Point filter 文本框里输入扩展点的名字,org.eclipse.wst.xml.core.catalogContributions,并选中该扩展点,点击 OK 按钮。 图 9. 选中扩展点 图 10 展示了成功添加扩展点后的 Extension 页面。
|