使用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月24日星期日
2006年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()的过程中
首先弄明白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
要不都搬过来?呃……这个……及其浩大的说,放十一再整整吧:P
订阅:
博文 (Atom)
