使用 Java 中的 Xerces 针对 XSD 1.1 进行 XML 验证

Posted

技术标签:

【中文标题】使用 Java 中的 Xerces 针对 XSD 1.1 进行 XML 验证【英文标题】:XML validation against XSD 1.1 with Xerces in Java 【发布时间】:2014-01-16 03:06:54 【问题描述】:

我已经通过 Maven 安装了 Xerces:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jdom</groupId>
        <artifactId>jdom</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.11.0</version>
    </dependency>            
</dependencies>

然后,我尝试使用Xerces FAQ 中的此示例中给出的代码来针对 1.1 版中的模式验证 XML 文件。这是我的代码:

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");

    // 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
at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:204)
at example.xml.XSDValidator.validateFile(XSDValidator.java:65)

似乎我未能正确配置/安装 Xerces。请帮我完成这项工作,XML 文件强制我使用 1.1 中的模式,我有一个正常运行的 1.0 验证器,但我对此有很大的问题。我感谢每一个提示!

【问题讨论】:

***.com/questions/2396903/… 这没有帮助。我遇到的问题是我想针对 XSD 1.1 而不是 1.0 进行验证 检查我编辑的答案。 【参考方案1】:

看起来您需要 Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) 版本,它不在 maven 存储库中。您可以从Xerces 网站下载它,并将其安装到本地 maven 存储库: mvn install:install-file -Dfile=xercesImpl.jar -DgroupId=xerces -DartifactId=xercesImpl -Dversion=2.11.0.beta -Dpackaging=jar 然后您就可以将它包含在您的 Maven 项目依赖项中:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0.beta</version>
</dependency>   

【讨论】:

感谢您的快速回复!我下载了 Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) - zip 二进制发行版,然后尝试安装它。当我使用你的 mvn 命令时,我得到的唯一答案就是你输入“mvn -version”时得到的答案。没有错误或确认消息。添加依赖会导致错误,所以我怀疑安装失败。在运行该命令之前,我是否必须将 xercesImpl.jar 放到特定文件夹中?我也试过给它文件的完整路径。 对不起!我的错。 -version=2.11.0.beta 应该是 -Dversion=2.11.0.beta。所以现在是完整的命令:mvn install:install-file -Dfile=xercesImpl.jar -DgroupId=xerces -DartifactId=xercesImpl -Dversion=2.11.0.beta -Dpackaging=jar 我为你检查了它,在将它安装到本地存储库并注入 pom.xml 版本为 2.11.0.beta 之后,模式工厂没有抛出异常。试试看,祝你好运 天哪,我本可以看到的! :D 非常感谢,我现在开始工作了。我还必须添加 org.eclipse.wst.xml.xpath2.processor_1.1.0.jar,否则我会遇到 classNotFound 异常。该 jar 位于与 xercesImpl.jar 相同的文件夹中。再次感谢!【参考方案2】:

我认为他们现在已将 2.11 版添加到 maven。 Maven 中的以下依赖项开箱即用:

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
</dependency>

【讨论】:

“开箱即用”是不同的。也许你知道我怎么了:***.com/questions/35941613/…【参考方案3】:

我将添加另一个答案,因为对我来说这种依赖不起作用(与 OP 描述的错误相同):

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
</dependency>

我认为 2.11.0 应该比 2.11.0.beta 更新,但该版本似乎不支持 xsd1.1!

相反,只有以下依赖项会为我带来有效的 XSD1.1 验证:

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

(在这个 SO 线程中找到:How to validate XML against XSD 1.1 in Java?)

【讨论】:

谢谢,这也适用于我。你有任何信息谁开发了这个版本 2.12 或者它是官方的吗?我在 Apache Xerces 官方网站上找不到任何关于 2.12 的信息。 我也没有,我只是在链接的 Stack Overflow 线程上挣扎,从那里我得到了工作依赖项。也许帖子的作者知道的更多。【参考方案4】:

Xerces2 Java 2.12.2 (XML Schema 1.1) - tar.gz [PGP] [SHA] 本周早些时候刚刚发布。 https://xerces.apache.org/mirrors.cgi#notes

【讨论】:

以上是关于使用 Java 中的 Xerces 针对 XSD 1.1 进行 XML 验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在通过 SAX Xerces 解析 XML Doc 时引用 XSD Schema 位置?

在 Java 中针对 xsd 的 XML 验证

如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?

可以在运行时使用 Objc/iPhone 代码针对 xsd 验证 xml

验证一个巨大的 XML 文件

要针对多个 xsd 模式验证 XML