2012-04-02 56 views
1

的Xerces聲稱允許XML目錄支持被添加到一個讀者是這樣的:Xerces可以同時支持XMLCatalogResolver和<xs:include/>嗎?

XMLCatalogResolver resolver = new XMLCatalogResolver(); 
resolver.setPreferPublic(true); 
resolver.setCatalogList(catalogs); 

XMLReader reader = XMLReaderFactory.createXMLReader(
    "org.apache.xerces.parsers.SAXParser"); 
reader.setProperty("http://apache.org/xml/properties/internal/entity-resolver", 
    resolver); 

但只要我這樣做,那麼在我的模式中的任何<xs:include/>標籤不再處理。看起來XMLCatalogResolver一旦添加就成爲實體解析的唯一去向,所以包含無法工作。 Eclipse OTOH成功驗證使用相同的目錄,因此它應該是possilbe。

有沒有辦法解決這個問題,還是有任何其他支持目錄的基於Java的驗證器?

謝謝,多米尼克。

回答

1

我終於通過覆蓋XMLCatalogResolver並記錄了對resolveEntity()方法的各種調用來解決了這個問題。我觀察到三種類型的調用正在進行,其中只有一種有意義使用XML目錄進行解析。所以,我僅僅爲其他兩種呼叫類型直接返回了FileInputStream

這裏是我我的自定義XMLCatalogResolver類中使用的代碼:

public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) 
    throws IOException 
{ 
    if(resourceIdentifier.getExpandedSystemId() != null) 
    { 
     return new XMLInputSource(resourceIdentifier.getPublicId(), 
      resourceIdentifier.getLiteralSystemId(), 
      resourceIdentifier.getBaseSystemId(), 
      new FileReader(getFile(resourceIdentifier.getExpandedSystemId())), 
      "UTF-8"); 
    } 
    else if((resourceIdentifier.getBaseSystemId() != null) && 
     (resourceIdentifier.getNamespace() == null)) 
    { 
     return new XMLInputSource(resourceIdentifier.getPublicId(), 
      resourceIdentifier.getLiteralSystemId(), 
      resourceIdentifier.getBaseSystemId(), 
      new FileReader(getFile(resourceIdentifier.getBaseSystemId())), 
      "UTF-8"); 
    } 
    else 
    { 
     return super.resolveEntity(resourceIdentifier); 
    } 
} 

private File getFile(String urlString) throws MalformedURLException 
{ 
    URL url = new URL(urlString); 
    return new File(url.toURI()); 
} 

我不知道爲什麼會不會默認內的Xerces完成,但希望這可以幫助那遇到這種旁邊的人問題。

相關問題