Как загрузить относительный системный DTD в парсер StAX?

Я использую 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() );
            }
        }
    }
}
  1. Это намеренно?
  2. Есть ли удобный способ убедить синтаксический анализатор StAX загрузить DTD относительно заданного XML-файла, а не относительно рабочего каталога?
6
задан MRA 21 May 2012 в 12:56
поделиться