Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证XSD文件_Java_Xml_Xsd - Fatal编程技术网

Java 验证XSD文件

Java 验证XSD文件,java,xml,xsd,Java,Xml,Xsd,我想验证XSD文件(不是XML)。我使用的方法是将XSD视为任何其他XML文件,并将其用作模式 我正在使用以下代码: String schemaLang = "http://www.w3.org/2001/XMLSchema"; SchemaFactory factory = SchemaFactory.newInstance(schemaLang); Schema schema = factory.newSchema(new StreamSource("C:\\Users\\aprasad\\

我想验证XSD文件(不是XML)。我使用的方法是将XSD视为任何其他XML文件,并将其用作模式

我正在使用以下代码:

String schemaLang = "http://www.w3.org/2001/XMLSchema";
SchemaFactory factory = SchemaFactory.newInstance(schemaLang);
Schema schema = factory.newSchema(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd"));
Validator validator = schema.newValidator();        
validator.validate(new StreamSource("shiporder.xsd"));
但我得到了以下错误:

无法读取架构文档“XMLSchema.xsd”,因为1)找不到该文档;2) 文件无法读取;3) 文档的根元素不是

由于文件路径正确,因此不确定错误是什么


请告诉我验证XSD文件的正确方法。

您需要在
XMLSchema.XSD
旁边添加两个文件。这些是:

XMLSchema.xsd
引用这两个文件

因此,如果
XMLSchema.xsd
位于
C:/XMLSchema.xsd
位置,则必须具有
C:/XMLSchema.dtd
C:/datatypes.dtd

SchemaFactory
实例默认情况下使用名为
XMLCatalogResolver
的内部类(请参见
SchemaFactory.setresourcesolver(lsresourcesolver)
),该类实现。前者(我假设)在referer旁边查找被引用的文件

如果您仔细查看,则导致
SAXParseException
的原因是
FileNotFoundException
,它表示系统找不到
XMLSchema.dtd
文件

除此之外,您的代码还可以(您的模式也可以)。

根据,如果您使用的构造函数方法接受
字符串,则该字符串必须是有效的URI。例如,如果试图引用本地文件,则可能需要在路径前面加上
file://
。或者,您可以将
文件
对象传递给构造函数:

Schema schema = factory.newSchema(new File(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd")));
总之,在这种情况下,最好做一些简单的测试,以排除由于程序找不到必要的文件而导致的问题,例如

File schemaFile1 = new File("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd");
File schemaFile2 = new File("shiporder.xsd");
assert schemaFile1.exists();
assert schemaFile2.exists();

我想知道你想要实现什么?如果factory.newSchema(X)没有抛出异常,那么X必须是有效的架构(*)。这似乎比根据模式文档的模式进行验证要简单得多


(*)反过来当然不一定正确:X可能对模式文档的模式有效,但由于其他原因无效,例如违反UPA约束。

您的问题不在于验证模式。正如错误消息所说,您的程序无法读取
XMLSchema.xsd
。这还不至于验证您自己的模式。在您担心接下来的两行之前,需要先修复程序的前三行。您的
shiporder.xsd
架构与问题无关。@skaffman-您能告诉我前3行需要什么修复吗?我得到了代码@java2s.com就阅读模式而言,该模式是从w3c下载的,此后不会更改。因此,您最好使用。如果文件存在,使用
file
StreamSource
带或不带
文件://
并不重要;参考的,丢失的文件。根据我的回答,我做了一个小测试。我通过加载
XMLSchema.xsd
创建了一个
Schema
,并对其自身进行了验证。在一台机器上,加载平均耗时30.76秒,验证平均耗时232.3毫秒。假设OP想要在运行中执行大量的模式文件验证,他/她最好将XML文档的XML模式加载到内存中并根据它验证文件,而不是为每个输入文件创建一个新的
模式。