Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以使用由循环依赖项组成的XML模式创建模式对象?_Java_Xml_Xsd - Fatal编程技术网

Java 有没有一种方法可以使用由循环依赖项组成的XML模式创建模式对象?

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

我得到了一个包含两个互相包含的.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);
  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的不同分支的话,这比这个还要多