我想验证XSD文件(不是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)文档的根元素不是
<xsd:schema>
。
由于文件路径正确,不确定错误是什么。
请告诉我验证XSD文件的正确方法。
答案 0 :(得分:2)
您需要在XMLSchema.xsd
旁边添加两个附加文件。这些是:
XMLSchema.xsd
引用这两个文件。
在旁边,如果XMLSchema.xsd
位于C:/XMLSchema.xsd
,那么您必须拥有C:/XMLSchema.dtd
和C:/datatypes.dtd
。
SchemaFactory
个实例使用(请参阅SchemaFactory.setResourceResolver(LSResourceResolver)
)一个名为XMLCatalogResolver
的内部类,它实现LSResourceResolver
。前者(我假设)在 referer 旁边查找引用的文件。
如果您真的 ,那么SAXParseException
的原因是FileNotFoundException
,表示系统无法找到XMLSchema.dtd
文件。< / p>
除此之外,您的代码还可以(以及您的架构)。
答案 1 :(得分:0)
根据javadoc for the StreamSource class,如果使用带有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();
答案 2 :(得分:0)
我想知道你想要实现的目标是什么?如果factory.newSchema(X)不抛出任何异常,则X必须是有效的模式(*)。对于模式文档的模式验证,这似乎要简单得多。
(*)反过来当然不一定是:X可能对模式文档的模式有效,但由于其他原因(例如违反UPA约束)而无效。