Я использую woodstox для реализации синтаксического анализатора StAX для XML-файлов. Предположим, что у меня есть допустимый файл XML с соответствующим DTD где-то в общем каталоге в моей файловой системе.
/path/to/test.xml
/path/to/test.dtd
XML ссылается на свое DTD, используя объявление относительного системного идентификатора следующим образом:
<!DOCTYPE test SYSTEM "test.dtd">
С точки зрения проверки, мне кажется, все в порядке. (Это так? xmlint не жалуется.) Однако, когда я пытаюсь разобрать файл с помощью приведенного ниже кода, woodstox выдает исключение java.io.FileNotFoundException, поскольку не может найти относительный файл DTD. Мне кажется, что реализация пытается получить доступ к файлу DTD относительно рабочего каталога, а не относительно объекта файла 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() );
}
}
}
}