validationXSD文件

我想validationXSD文件(而不是XML)。 我使用的方法是将XSD视为任何其他XML文件,并使用此www.w3.org/2001/XMLSchema.xsd作为模式。

我使用以下代码:

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)文档的根元素不是

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

请告诉我validationXSD文件的正确方法。

您需要在XMLSchema.xsd旁边有两个附加文件。 这些是:

  • XMLSchema.dtd
  • datatypes.dtd

XMLSchema.xsd引用这两个文件。

在旁边 ,所以如果XMLSchema.xsd位于C:/XMLSchema.xsd那么你必须拥有C:/XMLSchema.dtdC:/datatypes.dtd

SchemaFactory实例默认使用(参见SchemaFactory.setResourceResolver(LSResourceResolver) )一个名为XMLCatalogResolver的内部类,它实现了LSResourceResolver 。 前者(我假设)在引用者旁边查找引用文件。

如果看起来很难,那么SAXParseException的原因就是FileNotFoundException ,它说系统找不到XMLSchema.dtd文件。

除此之外,您的代码是正常的(也是您的架构)。

根据StreamSource类的javadoc ,如果使用带有String的构造函数方法,则该字符串必须是有效的URI。 例如,如果您尝试引用本地文件,则可能需要在路径前加上file:/ 。 或者,您可以将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)不抛出任何exception,则X必须是有效的模式(*)。 对于模式文档的模式validation来说,这似乎要简单得多。

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