图 15. 运行环境的 XML Catalog 配置 将 sample.xml 改错,可以看见 XML Catalog 的提示信息。 图 16. sampe.xml 文件 通过以上的步骤,我们演示了,如何扩展 XML Catalog。在下一个部分,我们将会演示如何扩展 URI Resolver 实现特殊 XML 文件的校验。 扩展 URI Resolver XML Catalog 虽然提供了比较强大的功能,但是由于实际生产环境的复杂性,一些 xml 文件并不能由其进行校验。比如,有些 xml 文件,由于书写不规范,并没有命名空间,还有些 xml 文件,由于应用环境的原因,其使用了 xsi:schemaLocation 元素,将引用的 xsd 文件直接定位到了虚拟的路径,导致 xml catalog 的定位功能失效 . 对于第一种情况,由于 XML Catalog 的设计理念就是通过命名空间进行 xml 和 xsd 的关联,所以,不支持此种情况。对于第二中情况,我们可以通过扩展 XML Catalog 来实现。 在扩展 URI Resolver 之前,我们对 XML Catalog 可以处理的 xml 和 xsd 的类型进行了分类,以便大家能够清楚地知道 XML Catalog 可以解决哪些问题。
URI Resolver 简介 URIResolver 负责资源的定位,XML Catalog 的处理器根据 URIResolver 的资源位置找到相应的 xsd,然后进行校验。 特殊的 XML 文件 如图 18 所示,sample.xml 文件里中有一个 xsi:shemaLocation 属性,它将 xsd 的位置定位到 http://www.sample.com/sample/schemas/student.xsd。正常情况下,XML Catalog 会到该位置去找 xsd, 然而,在本文中这是一个无效的地址,所以 XML Catalog 会因为找不到 xsd 而不起作用。 图 18. 带有 schemaLocation 标签的 XML 文件 扩展 org.eclipse.wst.common.uriresolver.resolverExtensions resolverExtensions 扩展点可以让用户注册自己的 URI Resolver,从而达到扩展默认 Resolver 的功能的作用。与默认的 Resolver 一样,用户扩展的 Resolver 也可以被编辑器,校验器和向导调用。 图 17. 添加扩展点 resolverExtensions 如下图所示,该扩展点有三个属性,class(类名), stage(阶段)和 priority(优先级)。Class 指定了实现 org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver 接口的类;stage 指定了在哪个阶段运行 resolver(解析器),有三个值,分别是 prenormalization, postnormalization 和 physical,默认是 physical。Prenormalization 表示解析器在输入参数的格式统一之前运行,postnormalization 表示解析器在输入参数的格式统一之前运行,physical 表示在所有的 pre 和 postnormalization 解析器之后运行。Priority 指定了在处在相同 stage 的解析器的执行优先级。优先级分为 high(高级),medium(中级)和 low(低级)三种,默认为中级。 图 18. 填写扩展点的属性 下图为增加了 resolverExtensions 扩展点的 plugin.xml 文件的内容。 图 19. plugin.xml 文件内容 实现 URIResolverExtension 1.首先,在插件中新建一个类,实现 URIResolverExtension 接口。URIResolverExtension 接口提供了 resolve 方法,用来重新定位 xsd 资源,也就是找到有效的 xsd。该方法的参数有四个,第一个类型为 IFile,是在工作空间 (workspace) 中的文件,第二个参数是 String baseloaction,它是该文件在文件系统的绝对路径,第三个参数是 publicId,它是该文件的命名空间,最后一个参数是 String systemid,它是文件的实际路径,对于 xml 文件来说,它的 systeid 为空。但是因为我们在第 2 小节扩展了 XML Catalog, 所以,对于在 XML Catalog 文件里面配置好的 publicId,它的 systemId 就是该文件里面 Uri 的值,也就是 xsd 文件的实际路径。该函数的返回值就是 xml 文件引用的 xsd 文件的位置。 清单 1. 实现 URIResolverExtension 接口
清单 2. 添加 catalog 到 catalog manager
清单 3. 重新定位资源
由清单 3 可以看出,我们通过 catalog manager 的 resolvePublic 方法,通过 publicId 找到 Catalog 里与 publicId 对应 uri 的值,这个值就是 xsd 文件的路径。 小结 本文首先介绍了 XML Catalog 相关概念以及基本原理,使读者对其有了初步的认识。接着通过一个简单的例子介绍了手动方式配置 XML Catalog 的步骤,使读者有了进一步的了解。最后,通过扩展 XML Catalog 和 URI Resolver 两个扩展点来实现比较高级的功能,使读者对该技术有了深入的了解。XML Catalog 是比较通用的解决 XML 实时校验问题的方法,尤其与 XML Catalog 和 URI Resolver 两个扩展点的结合在解决一些特殊的 XML 文件的实时校验问题时,往往能取得事半功倍的效果。 |