2012-04-02 52 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完成,但希望这可以帮助那遇到这种旁边的人问题。

相关问题