2011-06-13 19 views
9

Tengo un XML que estoy analizando con un analizador SAX en Java. Comienza con este preámbulo:En referencia a una DTD local en Java

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd"> 

¿Cómo puedo cambiar esto para usar una DTD local?

supongo que podría hacer algo como esto:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "file:///c:/MathML/mathml3.dtd"> 

No es exactamente así, pero algo así. Sin embargo, necesito que la ruta sea independiente del sistema del usuario.

¿Cómo uso una DTD local con una ruta relativa a la ruta de clase?

+1

posiblemente útil para mirar a esta pregunta: http://stackoverflow.com/questions/243728/how-to-disable-dtd-at-runtime-in-javas -xpath –

+0

Otra posibilidad es utilizar un catálogo XML que resuelva el doctype en un archivo local sin cambiar el XML. Esto lleva el cambio a un parámetro para la invocación del analizador. –

Respuesta

5

Consulte this article sobre el uso de catálogos XML para resolver DTD localmente sin tener que modificar su fuente XML. Los pasos básicos son:

  1. crear un archivo XML que se correlacione ID del sistema a las DTD locales
  2. modificar su código para crear instancias y configurar un CatalogResolver
  3. proporcionar al CatalogResolver al lector XML (obtenida del analizador)
1

Puede utilizar rutas relativas como:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "MathML/mathml3.dtd"> 

Ésta será relativa al directorio donde se ejecuta el programa Java y en función del analizador está utilizando, puede ser relativa al directorio de el xml que estás analizando

4

Cuando se trata de Aplicaciones web, puede poner la DTD en la carpeta lib y se refieren a ella como:

<!DOCTYPE name PUBLIC 
    "-//CMP//DTD dtdName 1.0//EN" 
     "/WEB-INF/lib/dtdName.dtd"> 
+0

¡esto es más simple que la primera respuesta! Gracias Hitham – mounaim

+0

Es más simple, pero es solo una solución –

+1

He publicado la respuesta como una solución de aplicación web y no por simplicidad –

1

también otra forma puede ser mantener la DTD en el localhost para que el camino final se convierte en algo así como:

<!DOCTYPE hibernate-configuration SYSTEM 
      "http://localhost/hibernate-configuration-3.0.dtd"> 

Definitivamente no es la solución más elegante, pero sin duda funciona.

+0

Hacky pero funciona, no olvide el número de puerto si tiene uno (localhost: 8080) – Mohammad

3

La solución es proporcionar la ubicación del archivo DTD en el sistema utilizando classpath. Por lo que el tipo de documento que trabajaba fuera de línea sería:

<!DOCTYPE hibernate-configuration SYSTEM 
    "classpath://org/hibernate/hibernate-configuration-3.0.dtd"> 
+0

Esto funciona solo con special [org.hibernate.util.DTDEntityResolver] (http://stackoverflow.com/questions/10886453/hibernate -issue-with-using-http-www-hibernate-org-dtd). – Vadzim

Cuestiones relacionadas