You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@xerces.apache.org by Armin Pfarr <ap...@vipsurf.de> on 2000/02/18 23:14:19 UTC

Entity-Resolver

Hi,

I'm trying to implement an entity-resolver using Xerces 1.0.1. The routine
work fine if I use public identifiers for ALL entities and redirect ALL
calls through the Entity-resolver.

Now I have a DTD, whose location is resolved through a public identifier.
That DTD includes external entities that are specified via relative
System-Identifiers. Here is a short excerpt:

<!-- Declaration of character entities -->
<!ENTITY % iso-latin1
	SYSTEM "../../Entities/ISOlat1.pen">
%iso-latin1;
<!ENTITY % iso-num
	SYSTEM "../../Entities/ISOnum.pen">
%iso-num;

These relative paths are resolved by Xerces, before the Entity-resolver is
invoked. My Entity resolver is not called like

resolveEntity(null,"../../Entities/ISOlat1.pen")

but instead like

resolveEntity(null,"file:/c:/Entities/ISOLat1.pen")

The crucial point ist, that Xerces does not construct the path above based
on the SystemId of the InputSource I constructed (I explicitelly set the
systemId with a call to setSystemId(...)), but instead based on the
System-Identifier that was stated in the document.

Any idea how to solve this problem?

Armin
P.S.
The entity-resolving works fine if I always use public identifiers. I can
then redirect to whatever source I like by using the method listed below

   protected InputSource getInputSource(String sysId) {
      InputSource src = null;
      try {
         URL url = new URL(sysId);
         src = new InputSource(url.openStream());
         src.setSystemId(sysId);
         if(debug()) log("Constructing InputStream from URL");
         return src;
      } catch (Exception e) {
	   // Malformed URL or IO Exception - don't care for details
         if(debug()) log(e.getMessage());
         src = null;
      }
	// probably the specified sysId isn't a valid URI, try if it
	// is a regualar filename
      try {
         src = SAXUtils.getFileInputSource(sysId);
         if(debug()) log("Constructing InputStream from File");
         return src;
      } catch (Exception e) {
         if(debug()) log(e.getMessage());
         src = null;
      }
      return src;
   }

The problem occurs no matter if I use a correct URI or a Filename for the
mapping