2012-04-02 12 views
1

Xerces behauptet XML Katalog Unterstützung zu ermöglichen, wie dies zu einem Leser hinzugefügt werden:Kann Xerces XMLCatalogResolver und <xs:include/> zur gleichen Zeit unterstützen?

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); 

Aber sobald ich dies tun, dann alle <xs:include/>-Tags in meinen Schemata werden nicht mehr bearbeitet. Es scheint so, als ob die XMLCatalogResolver die einzige Anlaufstelle für die Entity-Auflösung wird, sobald sie hinzugefügt wird, sodass Includes nicht mehr funktionieren. Eclipse OTOH validiert erfolgreich den gleichen Katalog, also sollte es möglich sein.

Gibt es eine Möglichkeit, oder gibt es andere Java-basierte Validatoren, die Kataloge unterstützen?

Danke, Dominic.

Antwort

1

Ich löste dies schließlich durch Überschreiben der XMLCatalogResolver und Protokollieren der verschiedenen Anrufe an die resolveEntity() Methode gemacht. Ich beobachtete drei Arten von Anrufen, von denen nur einer sinnvollerweise mit dem XML-Katalog aufgelöst werden konnte. Also, ich habe nur eine FileInputStream direkt für die anderen zwei Rufarten zurückgegeben.

Hier ist der Code ich in XMLCatalogResolver Klasse meiner Gewohnheit verwendet:

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()); 
} 

Ich bin nicht sicher, warum dies nicht standardmäßig innerhalb Xerces getan werden würde, aber hoffentlich hilft dies die nächste Person, die diese Begegnungen Problem.