我使用下面的代碼片段,使靜態塊內Schema對象:XSD是否在資源加載時自動加載?
URL url = getClass().getClassLoader().getResource("test.xsd");
和test.xsd是進口其他三個XSD文件,
我的問題是將進口時可用參考他們(比如驗證時),還是我必須通過創建URL對象來加載導入。
我使用下面的代碼片段,使靜態塊內Schema對象:XSD是否在資源加載時自動加載?
URL url = getClass().getClassLoader().getResource("test.xsd");
和test.xsd是進口其他三個XSD文件,
我的問題是將進口時可用參考他們(比如驗證時),還是我必須通過創建URL對象來加載導入。
不,您必須明確加載導入的XSD,因爲getResource()
不知道XSD語義 - 它在資源/文件級而不是XSD級別運行。
因爲當您使用getClass().getClassLoader().getResource("test.xsd");
時,您實際上並沒有加載test.xsd
,但只能獲取URL,您不需要執行其他任何操作。
XSD import
僅對適當的工具有意義。作爲示例驗證程序。
因此,當您將模式位置傳遞給驗證器時,它可以是絕對路徑,當前工作目錄或URL的相對路徑。
然後,當驗證過程XSD它會嘗試獲取imports
同樣的方式 - 因爲它在test.xsd
定義的絕對路徑,相對於test.xsd
模式位置或URL。
這不是太好用。 1.'getResource()'不加載任何東西。它只給出資源的URL。 'getResourceAsStream()'做。但是......對於任何由類加載器資源加載的XSD處理器(即驗證器)都沒有意義。它會嘗試通過打開在XSD – Vadim
中定義的模式位置來加載'imports'我想你是對的,我的答案會更適合'getResourceAsStream()'。 – kjhughes
是的。我總是惹他們。 :-)'getResource()'不是一個邏輯名稱,只能獲取URL。首先,它是一種資源 - 它自己... – Vadim