我已经获得了一个包含两个相互包含的.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相互包含,它们会一次又一次地加载,填满了内存空间。有没有办法打破这个循环并加载架构的其余部分而不改变架构设计?
答案 0 :(得分:0)
我的印象是,大多数架构处理器都可以处理循环包含:它们永远不是必需的,但它们应该是无害的。 (但是,关于这一点,规范还远未明确。)
由于您使用的是某种resourceResolver,因此架构处理器可能无法识别包含的URI指向它已经看过的文档。
另一方面,使用resourceResolver可能是在第二次及以后访问模式文档时不返回任何内容(或空xs:schema)来消除循环的方法。
您实际上并没有说明您正在使用哪个架构处理器:至少有两个处理器实现了您在此处使用的JAXP API - 如果您计算Xerces的不同分支,则会更多。