使用 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 位置?
如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?