Java验证API库,支持DTD。

5

我曾使用多个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 APIjava.xml.validation文档。它们都指出XMLConstants.XML_DTD_NS_URI被支持,但在Sun的JDK 5(以及我所看到的JDK 6)中未实现,并且我应该使用其他支持DTD验证的库。
我试图在谷歌上搜索,但没有找到任何东西(或者我不知道如何搜索)。我知道您可以使用DOM和TrAX对文档进行DTD验证,但这些需要您在文件系统上拥有DTD。我的DTD和模式位于类路径上,因此我需要为我的DTD进行自定义加载。这就是我一开始使用javax.xml.validation.SchemaFactoryjavax.xml.validation.Schema的原因,因为它们提供了更大的灵活性。
因此,我的问题是:是否有支持通过java验证API(XML_DTD_NS_URI)进行DTD验证的库(或库),我可以使用。我对不同类型的解决方案持开放态度。
1个回答

0
一个解决方法是将您的DTD和XML连接起来,然后使用无 .schema 的方式进行解析或验证。以下是一个示例:
String dtd;
String xml;
....
....

src = new InputSource( new ByteArrayInputStream( (dtd + xml).getBytes()) );
try {
    factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringComments(true);
    builder = factory.newDocumentBuilder();
    partnersDoc = builder.parse(src);
} catch ( ParserConfigurationException ex ){
    ex.printStackTrace(System.err);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接