我实际上正在尝试根据Java中的schematron文件验证xml文件。我有以下声明:
SchemaFactory factory = SchemaFactory.newInstance("http://www.ascc.net/xml/schematron");
但是当我运行程序时,我得到了这个错误:
Exception in thread "main" java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://www.ascc.net/xml/schematron could be loaded
有人能帮忙吗?谢谢
或者,您可以使用https://github.com/phax/ph-schematron/用于根据SCH文件验证XML。它既提供了"纯"验证,也提供了基于XSLT的验证。
您使用哪个版本和实现?
无论如何,试试:
http://purl.oclc.org/dsdl/schematron
这在ISO Schematron中进行了更改,http://www.ascc.net/xml/schematron
是旧的URI。
来自规范:
ISO Schematron现在与Schematron 1.5在四个实用方面有所不同尊重:
- 与其他ISO DSDL语言一样,使用持久URL(PURL)采用了一个新的命名空间:
http://purl.oclc.org/dsdl/schematron
没有实现模式的SchemaFactory
这并不一定意味着Uri是错误的(尽管你的Uri已经过时了,请参阅词典编纂者的答案)。
SchemaFactoy
是一个abstract
类,它隐藏了这样一个事实,即需要有一个特定于模式的子类来理解该模式。有标准Uris/schemas的实现,但对于默认Java安装中包含的schematron,似乎没有实现。
你可以找到";指令";如何在newInstance
方法的文档中提供自己的实现
为了找到给定模式语言的SchemaFactory对象,此方法按以下顺序查找以下位置[…]
- [..]系统属性";javax.xml.validation.SchemaFactory:schemaLanguage;[..]
- $java.home/lib/jaxp.properties[..]
- 服务提供者[..]匹配资源目录META-INF/services中的javax.xml.validation.SchemaFactory
三个中的最后一个可能是最有趣的一个。http://docs.oracle.com/javase/tutorial/ext/basics/spi.html如果您感兴趣,可以进一步解释java中的服务提供者模式。
但我想您不想实现自己的模式验证器,您只想使用一个。如果这两种方法对你有用的话,试试看。他们是在使用谷歌搜索ServiceFactory schematron
时出现的
- https://github.com/ugli/uglisch
- https://code.google.com/p/serene/wiki/isoSchematronSupport
可能还有更多的方法,而且似乎还有其他几种方法没有使用ServiceFactory
路径。请参阅在哪里可以找到ISO Schematron验证器的Java实现?