【发布时间】:2012-05-27 23:28:35
【问题描述】:
我正在使用woodstox 为XML 文件实现StAX 解析器。假设我在文件系统的公共目录中的某处有一个有效的 XML 文件,该文件具有匹配的 DTD。
/path/to/test.xml
/path/to/test.dtd
使用如下的相对系统标识符声明对其 DTD 的 XML 引用:
<!DOCTYPE test SYSTEM "test.dtd">
从验证的角度来看,我觉得一切都很好。 (是吗?xmllint 不会抱怨。)但是,当我尝试使用下面的代码解析文件时,woodstox 会抛出 java.io.FileNotFoundException,因为它找不到相关的 DTD 文件。在我看来,该实现尝试访问相对于工作目录而不是相对于 XML 文件对象的 DTD 文件。
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 解析器加载相对于给定 XML 文件而不是相对于工作目录的 DTD?
【问题讨论】: