MRA*_*MRA 6 xml stax dtd woodstox
我正在使用woodstox为XML文件实现StAX解析器.假设我的文件系统中的公共目录中有一个匹配DTD的有效XML文件.
/path/to/test.xml
/path/to/test.dtd
Run Code Online (Sandbox Code Playgroud)
XML使用相对系统标识符声明引用其DTD,如下所示:
<!DOCTYPE test SYSTEM "test.dtd">
Run Code Online (Sandbox Code Playgroud)
从验证的角度来看,一切似乎都很好.(是吗?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() );
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您将需要提供您自己的XMLResolver接口实现(在 SAX 世界中称为EntityResolver)来帮助解析器找到 DTD。有可以为您做到这一点的方法XMLInputFactory。setXMLResolver()
有关该主题的更多信息:
当解析器需要解析 SYSTEM URI 时,深入了解一下到底发生了什么也是一个好主意。例如,Woodstox 有一个内部(默认)实现XMLResolver(以及SAXEntityResolver和 StAXXMLResolver之间的代理)。看看它对 DTD“文件名”做了什么,您就会明白为什么它会这样工作。
| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |