2012-01-19 191 views
1

我已經在這個問題上存在了一段時間,但仍然無法完成它。我有一個使用XML Schema文件的Java項目,這些文件通過導入連接。所有這些都在同一水平的有效資源目錄,所以我使用類似:文件 schema.xsd當資源被路徑綁定時使用Java getResource

<xs:import schemaLocation="types.xsd"/> 

導入一個從另一個。現在,當我搶的

getResourceAsStream(absolutePath) 

架構來驗證它,我可以加載它的所有權利;問題在於驗證程序將在主項目目錄中尋找導入的 types.xsd而不是資源目錄。有沒有辦法解決這個問題,而不必硬編碼schemaLocation中的相對(構建結構相關)路徑?

+1

你使用了什麼Validator?另外,它看起來像是將文件流傳遞給驗證器,所以它無法知道文件的位置。也許有一個setter或另一個構造函數需要一個文件或一個字符串路徑? – Luciano

+0

是的,傳遞一個字符串有竅門!它現在看起來很簡單,非常感謝! ;) 我使用的'javax.xml.validation.Validator'在我的配置中是SAX。 –

回答

0

您的模式(包括導入)應該適用於讀取它的人。 schemaLocation由XSD定義,而不是由Java定義。相應地,任何導入的模式都應該用相對或絕對路徑來解決,而不是放在Java類路徑上。

0

在Java的XML API,總有教解析器/識別/變壓器如何解決外部引用的API:

  • 對於SAXParsers,有org.xml.sax.EntityResolver
  • 對於變形金剛,有javax.xml.transform.URIResolver
  • 而對於驗證器,還有org.w3c.dom.ls.LSResourceResolver

請注意,所有的人都接口,這樣就可以使自己的實現,然後使其通過相應的setter方法。

在你的情況下,它應該是這樣的:

 

    Validator validator=createValidator(); 
    validator.setResourceResolver(new LSResourceResolver() { 
     public LSInput resolveResource(String publicId, String systemId, String baseURI) { 
      File file=new File(resourcesRoot, systemId); 
      return new MyLsInput(file); 
     } 
    ); 
    validator.validate(source, result); 

MyLsInput代表某些用戶執行org.w3c.dom.ls.LSInput,這是一個很長的接口)。