支持 DTD 的 Java ValidationAPI 库

标签 java validation dtd

我使用多个 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 是用于开发一个类的接口(interface),该类可以解析根模式包含在其 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 documentation .它们都指定支持 XMLConstants.XML_DTD_NS_URI,但未在 Sun 的 JDK 5(据我所知在 JDK 6 中)实现,并且我应该使用其他一些支持 DTD 验证的库。

我尝试在 Google 上搜索,但没有找到任何内容(或者我不知道如何搜索)。我知道您可以使用 DOM 和 TrAX 根据 DTD 验证文档,但是这些要求您的文件系统上有 DTD。我的 DTD 和模式位于类路径中,因此我需要为我的 DTD 进行自定义加载。这就是我首先使用 javax.xml.validation.SchemaFactoryjavax.xml.validation.Schema 的原因,因为它们提供了更大的灵 active 。

所以我的问题是:是否有一个(或多个)库支持通过 java 验证 API (XML_DTD_NS_URI) 进行 DTD 验证,我可以使用。我对不同类型的解决方案持开放态度。

最佳答案

解决方法是连接您的 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);
}

关于支持 DTD 的 Java ValidationAPI 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11761590/

相关文章:

java - 从文件系统中的任何位置使用 Spring-Boot 和 Spring-MVC 提供文件服务

php - 在 PHP 自引用表单中使用 jQuery 进行表单验证

php - Jquery 验证检查数据库中是否存在值

python - 在没有非 python 依赖项的情况下在 Python 中验证 XML

java - 使用 Apache Ant 恢复停止的构建过程

java - 如何在 Windows 中通过端口查找 PID 并使用 Java 终止找到的任务

Java - xml 文档如何使用 XML 目录加载 DTD?

java - (撒克逊 dtd)java.net.SocketException : Unexpected end of file fromserver

java - 在没有 Git 存储库的情况下使用 Spring Cloud Config

c# - 从自定义验证器中验证上下文的基本类型获取值