Java XML验证-使用多个xsd';s

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

我有两个xsd文件来验证xml。但问题是我的代码只需要一个xsd。如何在下面的代码中使用其他xsd?我不知道应该在哪里放置/调用第二个xsd文件

             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());