2012-05-21 15 views
5

Estoy usando woodstox para implementar un analizador StAX para archivos XML. Supongamos que tengo un archivo XML válido con una DTD coincidente en algún lugar de un directorio común en mi sistema de archivos.Cómo cargar un DTD de sistema relativo en un analizador StAX?

/path/to/test.xml 
/path/to/test.dtd 

Las referencias XML a su DTD utilizando una declaración relativa identificador del sistema de la siguiente manera:

<!DOCTYPE test SYSTEM "test.dtd"> 

Desde un punto de vista validación, todo parece estar bien para mí. (¿Es? Xmllint no se queja). Sin embargo, cuando intento analizar el archivo con el siguiente código, woodstox lanza una java.io.FileNotFoundException, ya que no puede encontrar el archivo DTD relativo. Me parece que la implementación intenta acceder al archivo DTD relativo al directorio de trabajo en lugar de al objeto del archivo XML.

import java.io.FileInputStream; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamReader; 

public class Test { 

    public static void main(String[] args) throws Exception { 

     FileInputStream fileInputStream = new FileInputStream(args[0]); 
     XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xmlInputFactory.createXMLStreamReader(fileInputStream); 

     while(xsr.hasNext()) { 
      if(xsr.next() == XMLStreamConstants.DTD) { 
       System.err.println(xsr.getText()); 
      } 
     } 
    } 
} 
  1. Es esto intencional?
  2. ¿Existe alguna manera conveniente de convencer al analizador StAX de que cargue la DTD en relación con un archivo XML dado en lugar de hacerlo en relación con el directorio de trabajo?

Respuesta

3

usted va a tener que proporcionar su propia implementación de la interfaz XMLResolver (que ha sido conocido como EntityResolver en el mundo SAX) para ayudar a que el analizador encontrar el DTD. El XMLInputFactory tiene el método setXMLResolver() que lo haría por usted.

Algunos más información sobre el tema:

También es una buena idea echar un vistazo bajo el capó para entender lo que ocurre exactamente cuando analizadores necesitan para resolver un SISTEMA URI. Woodstox, por ejemplo, tiene an internal (and a default) implementation of the XMLResolver (así como a proxy between the SAX's EntityResolver and a StAX XMLResolver). Mira lo que hace con tu DTD "nombre de archivo" y verás por qué está funcionando como está.

Cuestiones relacionadas