WD1X.COM - 问答一下,轻松解决,电脑应用解决专家
主板显卡CPU内存显示器
硬盘维修显卡维修显示器维修
注册表系统命令DOS命令Win8
存储光存储鼠标键盘
内存维修打印机维修
WinXPWin7Win11Linux
硬件综合机箱电源散热器手机数码
主板维修CPU维修键盘鼠标维修
Word教程Excel教程PowerPointWPS
网络工具系统工具图像工具
数据库javascript服务器
PHP教程CSS教程XML教程

通过 XML Catalog 实现 XML 文件的自动化实时校验(3)

更新时间:2011-03-03 13:58 作者:佚名点击:

图 15. 运行环境的 XML Catalog 配置
通过 XML Catalog 实现 XML 文件的自动化实时校验

  将 sample.xml 改错,可以看见 XML Catalog 的提示信息。

图 16. sampe.xml 文件
通过 XML Catalog 实现 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 可以解决哪些问题。

xsd \ xml 有命名空间 无命名空间
有命名空间,无 xsi:schemaLocation 可以 不可以
有命名空间,有 xsi:schemaLocation,且其值是 xsd 实际存在的位置 可以 不可以
有命名空间,有 xsi:schemaLocation,且其值不是 xsd 实际存在的位置 可以 不可以
无命名空间
不可以 不可以

  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 文件
通过 XML Catalog 实现 XML 文件的自动化实时校验

  扩展 org.eclipse.wst.common.uriresolver.resolverExtensions

  resolverExtensions 扩展点可以让用户注册自己的 URI Resolver,从而达到扩展默认 Resolver 的功能的作用。与默认的 Resolver 一样,用户扩展的 Resolver 也可以被编辑器,校验器和向导调用。

图 17. 添加扩展点 resolverExtensions
通过 XML Catalog 实现 XML 文件的自动化实时校验

  如下图所示,该扩展点有三个属性,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. 填写扩展点的属性
通过 XML Catalog 实现 XML 文件的自动化实时校验

  下图为增加了 resolverExtensions 扩展点的 plugin.xml 文件的内容。

图 19. plugin.xml 文件内容
通过 XML Catalog 实现 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 接口

 public class MyURIResolverExtension implements URIResolverExtension { 
 
 public MyURIResolverExtension() { 
 } 
 
 @Override 
 public String resolve(IFile file, String baseLocation, String publicId, 
 String systemId) { 
 return null; 
 } 
 
 } 

清单 2. 添加 catalog 到 catalog manager

 ICatalog catalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog(); 
if (catalog == null) { 
  return null; 
 } 

清单 3. 重新定位资源

 if (myResolved == null) { 
 if (publicId != null) { 
 if ((systemId != null && systemId.endsWith("student.xsd"))) //$NON-NLS-1$ 
 { 
 try { 
 int index = systemId.lastIndexOf("/"); 
 if (index > -1) 
 
   systemId = systemId.substring(index); 
 myResolved = catalog.resolvePublic(publicId, systemId); 
 } catch (MalformedURLException me) { 
 myResolved = null; 
 } catch (IOException ie) { 
 myResolved = null; 
 } 
 } 
 } 
 } 

  由清单 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 文件的实时校验问题时,往往能取得事半功倍的效果。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
你可能感兴趣的内容