如何在Java中根据XSD 1.1验证XML?

2022-09-03 00:46:39

在 Java 中根据 XML Schema 1.1 验证 XML 文件的最佳方法是什么?

我从本教程中获取了代码,并将其查找工厂的行更改为使用 XML 架构 1.1,正如我在 Xerces FAQ 中的此代码示例中看到的那样。

这是我的代码:

import java.io.File;
import java.io.IOException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;

public class XSDValidator {
    private static void validateFile(File xmlFile, File xsdFile) throws SAXException, IOException
    {
        // 1. Lookup a factory for the W3C XML Schema language
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
        // SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

        // 2. Compile the schema.
        File schemaLocation = xsdFile;
        Schema schema = factory.newSchema(schemaLocation);

        // 3. Get a validator from the schema.
        Validator validator = schema.newValidator();

        // 4. Parse the document you want to check.
        Source source = new StreamSource(xmlFile);

        // 5. Check the document
        try
        {
            validator.validate(source);
            System.out.println(xmlFile.getName() + " is valid.");
        }
        catch (SAXException ex)
        {
            System.out.println(xmlFile.getName() + " is not valid because ");
            System.out.println(ex.getMessage());
        }
    }
}

代码将引发以下异常:

java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://www.w3.org/XML/XMLSchema/v1.1 could be loaded

正如我所看到的,我有与Xerces FAQ中的代码片段完全相同的导入。我甚至试图将Xerces添加到我的Maven依赖项中,但这也没有帮助。

干杯:)


答案 1

不幸的是,JDK捆绑版本(从Java 8开始)和maven central的最新官方版本(2.11.0)都不包含XSD 1.1实现。

您实际上需要Xerces的版本才能运行您链接的FAQ中的示例。2.11.0-xml-schema-1.1-beta

您可以执行下列操作之一。

  1. 从 Xerces 网站下载二进制文件,并手动将 jar 添加到类路径中(或通过 Maven 在本地安装)。链接:http://xerces.apache.org/mirrors.cgi。您至少需要满足以下条件:Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta)

    cupv10k-runtime.jar
    org.eclipse.wst.xml.xpath2.processor_1.1.0.jar
    xercesImpl.jar
    xml-apis.jar
    
  2. 使用以下非官方的 maven 依赖项。

    <dependency>
        <groupId>org.opengis.cite.xerces</groupId>
        <artifactId>xercesImpl-xsd11</artifactId>
        <version>2.12-beta-r1667115</version>
    </dependency>
    

答案 2

我不认为您可以使用 JAXP 服务机制来搜索 XSD 1.1 处理器。以正常方式加载 Saxon 或 Xerces,然后启用 XSD 1.1 处理。对于撒克逊人来说,这是使用

SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")

更新 2021-09-04在最近的 Saxon 版本中,XSD 1.1 是默认版本,无需设置任何特殊属性即可启用它。


推荐