catch (SAXException ex) {
System.out.println(input + " is not valid because ");
System.out.println(ex.getMessage());
}
}
}
如果用普通的 Sun JDK 不增加其他库,运行该程序时可能会看到如下所示的结果:
Exception in thread "main" java.lang.IllegalArgumentException:
http://relaxng.org/ns/structure/1.0
at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:186)
at DocbookRELAXNGCheck.main(DocbookRELAXNGCheck.java:14)
这是因为,JDK 本身没有带 RELAX NG 验证程序。如果不能识别模式语言,SchemaFactory.newInstance() 就会抛出 IllegalArgumentException。但是如果安装了 RELAX NG 库,比如 Jing 和 JAXP 1.3 适配程序,就会与 W3C 模式显示同样的结果。
确定模式语言
javax.xml.constants 类定义了几个常量来标识模式语言:
XMLConstants.W3C_XML_SCHEMA_NS_URI:http://www.w3.org/2001/XMLSchema
XMLConstants.RELAXNG_NS_URI:http://relaxng.org/ns/structure/1.0
XMLConstants.XML_DTD_NS_URI:http://www.w3.org/TR/REC-xml
这是一个不完全的列表。实现可以随时向该表增加其他 URL 来标识其他的模式语言。URL 通常是模式语言的名称空间统一资源标识符(URI)。比如,URL http://www.ascc.net/xml/schematron 标识了 Schematron 模式。
Sun 的 JDK 5 仅支持 XSD 模式。虽然也支持 DTD 验证,但是它不能通过 javax.xml.validation API 使用。对于 DTD,必须使用常规的 SAX XMLReader 类。不过可以另外安装支持不同模式语言的其他库。
如何定位模式工厂
Java 编程语言没有限制模式工厂只能有一种。可以把标识某种模式语言的 URI 传递给 SchemaFactory.newInstance(),它按照下列顺序搜索匹配的工厂:
用 "javax.xml.validation.SchemaFactory:schemaURL" 系统属性命名的类
用 $java.home/lib/jaxp.properties 文件中的 "javax.xml.validation.SchemaFactory:schemaURL" 属性命名的类
在任何 Java Archive (JAR) 文件的 META-INF/services 目录中发现的 javax.xml.validation.SchemaFactory 服务提供程序
平台默认的 SchemaFactory,JDK 5 中为 com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl
要支持自定义的模式语言和对应的验证程序,只需要编写 SchemaFactory、Schema 和 Validator(它们知道如何处理模式语言)的子类。然后将您的 JAR 文件安装到上述四个位置中的一个。对于添加与 W3C XML Schema 语言这类声明性语言相比更适合用 Java 之类的图灵完整语言检查的约束,这一点很重要。可以定义一种微模式语言,编写简单的实现,然后将其插入到验证层。
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。