在Java中针对XML Schema 1.1验证XML文件的最佳方法是什么?
我从这个tutorial获取了代码并更改了它在工厂中查找的行以使用XML Schema 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依赖项中,但这也没有帮助。
干杯:)
答案 0 :(得分:16)
不幸的是,JDK捆绑版本(从Java 8开始)和maven central(2.11.0)的最新官方版本都没有包含XSD 1.1实现。
您实际上需要2.11.0-xml-schema-1.1-beta
版本的Xerces才能在您链接的常见问题解答中运行该示例。
您可以执行以下操作之一。
从Xerces网站下载Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta)
二进制文件,并手动将jar添加到类路径(或通过Maven在本地安装)。链接:http://xerces.apache.org/mirrors.cgi。您至少需要以下内容:
cupv10k-runtime.jar
org.eclipse.wst.xml.xpath2.processor_1.1.0.jar
xercesImpl.jar
xml-apis.jar
使用以下非官方maven依赖项。
<dependency>
<groupId>org.opengis.cite.xerces</groupId>
<artifactId>xercesImpl-xsd11</artifactId>
<version>2.12-beta-r1667115</version>
</dependency>
答案 1 :(得分:7)
我认为您不能使用JAXP服务机制来搜索XSD 1.1处理器。以正常方式加载Saxon或Xerces,然后启用XSD 1.1处理。对于Saxon来说,这是使用
完成的SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")
答案 2 :(得分:1)
搜索了一段时间后,this tutorial包含了对我有用的这些依赖项:
<dependency>
<groupId>org.exist-db.thirdparty.xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.0</version>
<classifier>xml-schema-1.1</classifier>
</dependency>
<!-- xpath2 and java-cup are needed at runtime
for xercesImpl Schema 1.1 support -->
<dependency>
<groupId>org.exist-db.thirdparty.org.eclipse.wst.xml</groupId>
<artifactId>xpath2</artifactId>
<version>1.2.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>edu.princeton.cup</groupId>
<artifactId>java-cup</artifactId>
<version>10k</version>
<scope>runtime</scope>
</dependency>
不幸的是,这些库似乎不是官方的。因此,使用它需要您自担风险。
答案 3 :(得分:0)
有一个通用的XML验证器可以使用XML Schema v1.1,它使用xercesImpl-xsd11
2.12-beta-r1667115
。验证程序可用here as a Maven plugin和here as an embeddable library。