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