Buscar un DTD en el CLASSPATH (SAX y DOM)
Artículo por Club Developers · 23 mayo 2006
2120 vistas
Esta solución usa la especificación JAXP 1.2
El DTD estará descrito asà en el documento XML:
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:
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:
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:
El DTD estará descrito asà en el documento XML:
xml
<!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
 {   try   {    if (!systemId.startsWith("file:"))    {     return null;    }    if (!pathDtd.startsWith("/"))    {     pathDtd = "/" + pathDtd;    }    if (null == is)    {     return null;    }    return new InputSource(is);   }   {    return null;   }  }
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
SAXParser parser =... 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
DocumentBuilder builder = ... builder.setEntityResolver(new MonEntityResolver());