我曾使用多个xsd模式来验证XML文档。以下是我使用的代码:
public static Schema createSchemaXSD(InputStream inputXSD, LSResourceResolver resolver) throws SAXException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(resolver);
Source schemaSource = new StreamSource(inputXSD);
Schema schema = factory.newSchema(schemaSource);
return schema;
}
LSResourceResolver
是一个接口,用于开发一个类,该类可以解析在其 xsd 中包含的 xsd 模式的加载。我编写了一个实现,从类路径中加载包含的文件,因为我的模式是打包在其中的(而不是在文件系统中)。
突然间,我需要切换到验证多个 DTD,所以我将代码更改为:
public static Validator createValidatorDTD(InputStream inputDTD, LSResourceResolver resolver) throws SAXException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.XML_DTD_NS_URI);
factory.setResourceResolver(resolver);
Source schemaSource = new StreamSource(inputDTD);
Schema schema = factory.newSchema(schemaSource);
Validator validator = schema.newValidator();
return validator;
}
很遗憾,这个方法不起作用。在创建SchemaFactory的工厂时会抛出异常:
No SchemaFactory that implements the schema language specified by: http://www.w3.org/TR/REC-xml could be loaded
我根据文章进行了研究:Java XML Validation API和java.xml.validation文档。它们都指出
XMLConstants.XML_DTD_NS_URI
被支持,但在Sun的JDK 5(以及我所看到的JDK 6)中未实现,并且我应该使用其他支持DTD验证的库。我试图在谷歌上搜索,但没有找到任何东西(或者我不知道如何搜索)。我知道您可以使用DOM和TrAX对文档进行DTD验证,但这些需要您在文件系统上拥有DTD。我的DTD和模式位于类路径上,因此我需要为我的DTD进行自定义加载。这就是我一开始使用
javax.xml.validation.SchemaFactory
和javax.xml.validation.Schema
的原因,因为它们提供了更大的灵活性。因此,我的问题是:是否有支持通过java验证API(
XML_DTD_NS_URI
)进行DTD验证的库(或库),我可以使用。我对不同类型的解决方案持开放态度。