XML 验证 - 使用多个 xsd

2022-09-03 00:21:35

我有两个 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();
                    }
                }

答案 1

在SO或Google上搜索时点击量很大。其中之一是这个问题,作者找到了自己的解决方案,并报告了以下代码以将多个xsd添加到验证器中:

Schema schema = factory().newSchema(new Source[] {
  new StreamSource(stream("foo.xsd")),
  new StreamSource(stream("Alpha.xsd")),
  new StreamSource(stream("Mercury.xsd")),
});

但是,当直接使用 on 时,解析程序无法加载任何引用的 XSD 文件。例如,如果文件导入或包含第三个文件(不是),则架构创建将失败。您应该设置系统标识符 () 或(甚至更好)使用构造函数。InputStreamStreamSourcexsd1xsd2setSystemIdStreamSource(File 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(String systemId)File

new StreamSource(getClass().getClassLoader().getResource("a.xsd").toExternalForm());

答案 2

推荐