2017-02-20 42 views
0

我使用下面的代碼片段,使靜態塊內Schema對象:XSD是否在資源加載時自動加載?

URL url = getClass().getClassLoader().getResource("test.xsd"); 

和test.xsd是進口其他三個XSD文件,

我的問題是將進口時可用參考他們(比如驗證時),還是我必須通過創建URL對象來加載導入。

回答

0

不,您必須明確加載導入的XSD,因爲getResource()不知道XSD語義 - 它在資源/文件級而不是XSD級別運行。

+0

這不是太好用。 1.'getResource()'不加載任何東西。它只給出資源的URL。 'getResourceAsStream()'做。但是......對於任何由類加載器資源加載的XSD處理器(即驗證器)都沒有意義。它會嘗試通過打開在XSD – Vadim

+0

中定義的模式位置來加載'imports'我想你是對的,我的答案會更適合'getResourceAsStream()'。 – kjhughes

+0

是的。我總是惹他們。 :-)'getResource()'不是一個邏輯名稱,只能獲取URL。首先,它是一種資源 - 它自己... – Vadim

0

因爲當您使用getClass().getClassLoader().getResource("test.xsd");時,您實際上並沒有加載test.xsd,但只能獲取URL,您不需要執行其他任何操作。

XSD import僅對適當的工具有意義。作爲示例驗證程序。

因此,當您將模式位置傳遞給驗證器時,它可以是絕對路徑,當前工作目錄或URL的相對路徑。

然後,當驗證過程XSD它會嘗試獲取imports同樣的方式 - 因爲它在test.xsd定義的絕對路徑,相對於test.xsd模式位置或URL。