有没有办法使用由循环依赖项组成的XML模式创建Schema对象?

时间:2011-12-07 19:35:01

标签: java xml xsd

我已经获得了一个包含两个相互包含的.xsd文件的模式(a.xsd包括b.xsd,b.xsd包含a.xsd)。当我通过我的代码运行它们以返回一个Schema对象时,我得到一个内存不足的例外。

我的代码如下:

protected Schema createSchema(String fileName) throws Exception  {
  SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  factory.setResourceResolver(resourceResolver);
  Resource schemaResource = resourceLoader.getResource(fileName);
  StreamSource streamSource = new StreamSource(schemaResource.getInputStream());
  Schema schema = factory.newSchema(streamSource);
  return schema;
}

如果我错了,请纠正我,factory.newSchema(streamSource)正在使用包含和导入来将源加载到内存中。由于这两个xsd相互包含,它们会一次又一次地加载,填满了内存空间。有没有办法打破这个循环并加载架构的其余部分而不改变架构设计?

1 个答案:

答案 0 :(得分:0)

我的印象是,大多数架构处理器都可以处理循环包含:它们永远不是必需的,但它们应该是无害的。 (但是,关于这一点,规范还远未明确。)

由于您使用的是某种resourceResolver,因此架构处理器可能无法识别包含的URI指向它已经看过的文档。

另一方面,使用resourceResolver可能是在第二次及以后访问模式文档时不返回任何内容(或空xs:schema)来消除循环的方法。

您实际上并没有说明您正在使用哪个架构处理器:至少有两个处理器实现了您在此处使用的JAXP API - 如果您计算Xerces的不同分支,则会更多。