2006年9月24日星期日

Java中解析XML的相对路径DTD所遇到的问题及Eclipse RCP中的相关问题

使用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资源的相对路径。

2006年9月18日星期一

纪念9.18国耻日

万里长城十亿兵,
血仇岂待儿孙平?
愿提十万虎狼师,
金戈铁马踏东京。

2006年9月13日星期三

Java正则表达式中group()、group(i)、groupCount的含义

花了两个小时才搞明白,有点儿笨:P

首先弄明白Java的正则表达式中捕获组的概念,也就是以括号对“()”分割出的子Pattern,为什么要用到子模式呢?这是为了能在一次匹配中找出关心部分,例如:
input: abbc
pattern:a(b*)c
group0: a(b*)c
group1:(b*)

整个pattern是可以匹配abbc的,group()方法就是获得当前查找里面整个pattern所匹配的子序列,所以你可以通过group()找到“abbc”;

与此同时,我还对其中的b的个数感兴趣,就可以通过group1来得到关于(b*)的匹配情况,group(i)就是获得当前查找里面指定的捕获组所匹配的子序列,所以你可以通过group(0)来找到“bb”;

上面说清楚了,groupCount()的含义就很容易明白了,它并不是指在输入序列中Pattern总共匹配了多少次,而是指的捕获组的个数,当然它不对“整个pattern”计数,而只对“子Pattern”计数,如上例中groupCount()返回1,而如果我们将input改为“abbc abbc abbc”,——有三次匹配——groupCount()还是返回1

好了,我想废了半天话,概念应该讲清楚了,希望日后能记在脑袋里,不要天天来烦blogger.com:P



* 文中所谓的:
1、“序列”是指字符序列,也就是CharSequence的意思
2、当前查找是指一次find()或matches()的过程中

2006年9月10日星期日

又测Blogger beta

为何又说个“又”字?前几天试验了一下的,也不知是怪我粗心还是这几天改进不少,反正发现多多啊,从此Blogger Live多了不少乐趣,Bingo!
要不都搬过来?呃……这个……及其浩大的说,放十一再整整吧:P