Java 有没有一种方法可以使用由循环依赖项组成的XML模式创建模式对象?
我得到了一个包含两个互相包含的.xsd文件的模式(a.xsd包括b.xsd,b.xsd包括a.xsd)。当我在代码中运行它们以返回模式对象时,会出现内存不足异常 我的代码如下:Java 有没有一种方法可以使用由循环依赖项组成的XML模式创建模式对象?,java,xml,xsd,Java,Xml,Xsd,我得到了一个包含两个互相包含的.xsd文件的模式(a.xsd包括b.xsd,b.xsd包括a.xsd)。当我在代码中运行它们以返回模式对象时,会出现内存不足异常 我的代码如下: protected Schema createSchema(String fileName) throws Exception { SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); fac
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相互包含,它们被反复加载,填满了内存空间。有没有办法打破这个循环,在不改变模式设计的情况下加载模式的其余部分?我的印象是,大多数模式处理器都可以处理循环包含:它们从来都不是必需的,但应该是无害的。(然而,规范在这一点上还很不明确。) 由于您使用的是某种类型的resourceResolver,因此模式处理器可能无法识别包含的URI指向它已经看到的文档 另一方面,使用resourceResolver可能是消除循环的一种方法,在第二次和后续访问模式文档时不返回任何内容(或返回空的xs:schema)
实际上,您并没有说您使用的是哪个模式处理器:至少有两个处理器实现了您在这里使用的JAXP API——如果您计算Xerce的不同分支的话,这比这还要多。我的印象是,大多数模式处理器都可以处理循环包含:它们从来都不是必需的,但它们应该是无害的。(然而,规范在这一点上还很不明确。) 由于您使用的是某种类型的resourceResolver,因此模式处理器可能无法识别包含的URI指向它已经看到的文档 另一方面,使用resourceResolver可能是消除循环的一种方法,在第二次和后续访问模式文档时不返回任何内容(或返回空的xs:schema) 实际上,您并没有说您使用的是哪个模式处理器:至少有两个处理器实现了您在这里使用的JAXP API——如果您计算Xerce的不同分支的话,这比这个还要多