2011-12-07 41 views
2

我給出了一個包含兩個包含對方的.xsd文件的模式(a.xsd包括b.xsd,b.xsd包含a.xsd)。當我通過我的代碼運行它們以返回一個Schema對象時,我得到一個內存不足異常。有沒有辦法使用由循環依賴關係組成的XML模式創建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

我的印象是,大多數模式處理器可以處理循環包括:他們從來沒有必要,但他們應該是無害的。 (但是,在這一點上,規範還很不明確。)

由於您正在使用某種類型的resourceResolver,因此模式處理器可能無法識別包含的URI指向它的文檔已經見過。

另一方面,使用resourceResolver可能是一種通過在第二次及以後訪問模式文檔時不返回任何內容(或空的xs:模式)來消除循環的方法。

實際上你並沒有說出你正在使用哪個模式處理器:至少有兩個處理器實現了你在這裏使用的JAXP API--更重要的是,如果你計算Xerces的不同分支。

相關問題