Buscar un DTD en el CLASSPATH (SAX y DOM)

2117 vistas

Esta solución usa la especificación JAXP 1.2

El DTD estará descrito asà en el documento XML:



xml
  1. <!DOCTYPE document SYSTEM "file:MaDtd.dtd" >



De esta manera, en el momento de lso test, podremos poner el fichero "MaDtd.dtd" en el directorio donde se lanza la aplicación.

Para SAX:
En el DefaultHandler redefiniremos el método resolveEntity de la siguiente manera:



java
  1. public InputSource resolveEntity(String publicId, String systemId) throws SAXException
  2.   {
  3.     try
  4.     {
  5.       if (!systemId.startsWith("file:"))
  6.       {
  7.         return null;
  8.       }
  9.       String pathDtd = systemId.substring(5);
  10.       if (!pathDtd.startsWith("/"))
  11.       {
  12.         pathDtd = "/" + pathDtd;
  13.       }
  14.       InputStream is = getClass().getResourceAsStream(pathDtd);
  15.       if (null == is)
  16.       {
  17.         return null;
  18.       }
  19.       return new InputSource(is);
  20.     }
  21.     catch (Exception e)
  22.     {
  23.       return null;
  24.     }
  25.   }



Cuando este método devuelva null, el parser XML usará su método de búsqueda por defecto para encontrar el DTD.

Para decir al parser SAX que use este método resolveEntity:



java
  1. SAXParser parser =...
  2. parser.getXMLReader().setEntityResolver(monHandler);



Para DOM:
Para DOM tendremos que hacer que una clase implemente la interfaz EntityResolver.

El código del método resolveEntity es exactamente el mismo que para SAX.

Para especificar al parser DOM qué método usar:



java
  1. DocumentBuilder builder = ...
  2. builder.setEntityResolver(new MonEntityResolver());