Java XML验证-使用多个xsd';s
我有两个xsd文件来验证xml。但问题是我的代码只需要一个xsd。如何在下面的代码中使用其他xsd?我不知道应该在哪里放置/调用第二个xsd文件Java XML验证-使用多个xsd';s,java,xml,validation,Java,Xml,Validation,我有两个xsd文件来验证xml。但问题是我的代码只需要一个xsd。如何在下面的代码中使用其他xsd?我不知道应该在哪里放置/调用第二个xsd文件 private void validate(File xmlF,File xsd1,File xsd2) { try { url = new URL(xsd.toURI().toString());// xsd1
private void validate(File xmlF,File xsd1,File xsd2) {
try {
url = new URL(xsd.toURI().toString());// xsd1
} catch (MalformedURLException e) {
e.printStackTrace();
}
source = new StreamSource(xml); // xml
try {
System.out.println(url);
schema = schemaFactory.newSchema(url);
} catch (SAXException e) {
e.printStackTrace();
}
validator = schema.newValidator();
System.out.println(xml);
try {
validator.validate(source);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在SO或Google上搜索时点击率高。其中之一是问题,作者在其中找到了自己的解决方案,并报告了以下代码,以向验证器添加多个xsd:
Schema schema = factory().newSchema(new Source[] {
new StreamSource(stream("foo.xsd")),
new StreamSource(stream("Alpha.xsd")),
new StreamSource(stream("Mercury.xsd")),
});
但是,在StreamSource
上直接使用InputStream
时,解析程序无法加载任何引用的XSD文件。例如,如果文件xsd1
导入或包含第三个文件(不是xsd2
),则架构创建将失败。您应该设置系统标识符(setSystemId
),或者(更好地)使用StreamSource(文件f)
构造函数
调整为您的示例代码:
try {
schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = schemaFactory.newSchema(new Source[] {
new StreamSource(xsd1), new StreamSource(xsd2)
});
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
注:
如果使用类路径资源,我更喜欢StreamSource(stringsystemid)
构造函数(而不是创建文件
):
你已经试过了吗?是的。我试过了。它不起作用,可能是因为Source[]用于xml。我们无法将xsd类型转换为源代码。与前面关于这个XML验证项目的问题一样,我想向您指出。您的代码片段远未完成,因为您定义了此方法之外的变量等。注意您提问的方式,有助于我们帮助您。这可能与我上面的问题完全相同。这与您在评论中提供的解决方案相同。这就是为什么我对你的评论投了赞成票。不过OP在实施上有困难;我在Eclipse中已经准备好了回答他之前的问题的代码,并简单地对其进行了调整,以显示如何使用Source[]。希望没有什么不快?@Michael-O这就是为什么你应该把它作为答案发布,而不是评论
新的StreamSource(getClass().getClassLoader().getResource(“a.xsd”).toExternalForm())
解决了我的问题,谢谢!
new StreamSource(getClass().getClassLoader().getResource("a.xsd").toExternalForm());