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());
}
}
}
}
- Es esto intencional?
- ¿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?