【问题标题】:Java ValidationAPI library that supports DTD支持 DTD 的 Java ValidationAPI 库
【发布时间】:2012-07-30 11:41:57
【问题描述】:

我使用多个 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 documentation。他们都指定支持XMLConstants.XML_DTD_NS_URI,但在 Sun 的 JDK 5 中没有实现(据我所知,在 JDK 6 中),我应该使用其他一些支持 DTD 验证的库。

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

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

【问题讨论】:

    标签: java validation dtd


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多