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

10

我已经通过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版本验证器,但是对于这个版本我遇到了很大的问题。感谢每一个提示!


https://dev59.com/pEzSa4cB1Zd3GeqPmWmT - MGorgon
那没什么帮助。我遇到的问题是我想针对 XSD 1.1 进行验证,而不是 1.0。 - Vogon Jeltz
请检查我的修改后的答案。 - MGorgon
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7
看起来你需要 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放置到特定的文件夹中?我还尝试了向文件提供完整路径。 - Vogon Jeltz
1
抱歉!这是我的错。-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 我已经为您检查过了,在将其安装到本地存储库并注入到带有版本 2.11.0.beta 的 pom.xml 后,模式工厂不会抛出任何异常。试试看,祝你好运。 - MGorgon
1
哦,老兄,我本可以看到那个错误!:D 非常感谢,现在它可以正常工作了。我不得不添加org.eclipse.wst.xml.xpath2.processor_1.1.0.jar,否则我会得到一个classNotFound异常。那个jar文件和xercesImpl.jar在同一个文件夹中。再次感谢! - Vogon Jeltz

6

我会加入另一个答案,因为对于我来说,这个依赖关系没有起作用(和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线程中找到:如何在Java中验证XML是否符合XSD 1.1?


谢谢,那对我也起作用。你有关于2.12版本的开发者或者它是否是官方版本的任何信息吗?我在官方Apache Xerces网站上找不到任何关于2.12版本的信息。 - Vogon Jeltz
我也一样,我只是在链接的 Stack Overflow 主题上苦苦挣扎,从中得到了可用的依赖项。也许这篇文章的作者知道更多。 - Alex

1

我认为他们现在已经将版本2.11添加到Maven中了。以下依赖关系在Maven中可以直接使用:

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

“开箱即用”是不同的。也许你知道我哪里出了问题:https://stackoverflow.com/questions/35941613/example-to-validate-a-xml-file-against-an-xsd-v1-1-schema-in-java-1-8 - Alex

1

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