使用DOM还是SAX解析XML,都可能存在要解析xml中的相对路径的DTD文件的问题,前一段时间一直搞不定,今天总算弄懂了,其关键就在于org.xml.sax.InputSource!
任何方式解析xml,都可以以InputSource对象传入到解析器中,以前一直觉得InputSource是不是太累赘了,不要也罢,但如果碰到上述问题,则必须通过InpuSource来解决,方法如下:
比如XML文件test.xml在c:/testxml目录中,其中定义了,说明spring-beans.dtd与XML文件在同一目录中
首先,我们获取c:/testxml目录的URL,然后将其字符形式传递给InputSource作为SystemID,用于定位要解析的XML中的相对路径的父目录,最后解析器解析XML时就不会报错了。
URL url= new File("c:/testxml").toURL();
inputSource.setSystemId(url.toExternalForm());
saxParser.parse(inputSource,sax);
我所遇到的情况更为复杂些,是通过Eclipse Bundle来寻找dtd的。在程序中我通过如下函数找到Bundle中的文件:
public static URL getPluginFileURL(String relativePath) {
Bundle bundle = BizeditorPlugin.getDefault().getBundle();
Path path = new Path(relativePath);
return FileLocator.find(bundle, path, null);
}
但如果要寻找目录的URL,参数的最后必须是File.separator结尾,否则就会被认为是文件了,也就是使用 getPluginFileURL("testxml" + File.separator) 来获得要传入inputSource的SystemID,这样解析的时候Eclipse内部的URLHandler才会正确识别bundle资源的相对路径。

没有评论:
发表评论