最近我一直在寻找xml搜索工具,我编写的应用程序需要定期的搜索一些有关联的xml文件,我本来的意思是为了看一看文件中是否有与我想要的数据匹配的数据,但是有时候,我也想把找到的这些数据输出出来。 一开始,我试用了一下xslt和xpath,想通过把搜索的问题转化成使用xslt能够解决的问题,但是经过一段时间的试验,我发现,使用xslt并没有真正解决我想要处理的搜索问题,因为我想要输出的数据是使用逗号隔开的数,而xslt不能满足这个要求,而且xlst也不能提供全文搜索功能。然后我想尝试一下使用xml查询语言(xql),来看看能不能解决,所以我仔细的着了一下xql的各种版本的实现,很巧,正好发现一个叫xqengine的小工具能解决这个问题,所以,在本文中我想介绍一下如何使用xqengine来在你的xml文件中搜寻你想要找的字符串数据。
xqengine可以在www.fatdog.com网站下找到,它是一个javabean,使用一个sax解析器来索引一个或多个xml文档,然后你就可以在这些文档中进行复合式搜索了。它所使用的搜索语言是xql的超集,与xpath有相似的语法。
使用xqengine的java类必须实现一个result()方法,完成搜索后,引擎将调用这个方法把搜索结果传到result()方法中,可以使用三种显示数据的格式来输出数据结果。使用命令行参数指明你所需要的搜索参数,比如说你可以指明一个文件假如含有stop这个词,就不会被索引;又如你可以在参数中命令引擎忽略那些少于指定子数的词。
下面,我给出了一个使用xqengine的例程,现在让我们来分析一下。首先,main()方法实例化一个搜索引擎:xmlengine engine = new xmlengine(),然后它从命令行中取得文件名、返回结果格式和搜索请求这三个参数,再使用各种配置方法来设置引擎,接着调用setsaxparsername()方法来设置sax解析器的全名,因为我们使用的是xerces解析器,所以要用到 "org.apache.xerces.parsers.saxparser"。然后我们就需要设置搜索参数,再本例中,我们将不索引数字或任何少于3个字符的词。在你下载到的xqengine的api文档当中会有详细的配置参数说明,所以在此我就不细说如何配置参数了,请大家自己参阅相关文档。最后,setdocument()方法指定xqengine将要索引或搜索的xml文件。当然,如果你想要索引多个文件的话,只需设置几个相应的setdocument()方法就可以了。
从下面的代码中我们还可以看到,xqengine引擎将用三种不同的格式返回搜索结果:standard、summary和csv(使用逗号分开的数值)为了简单起见,我为每种返回结果类型定义了一个数字来代替(1,2,3),然后使用相应的参数调用setlistenertype()方法。我将在后面详细介绍每一种返回结果类型。还有个方法printsessionstate()用来输出索引和引擎的信息,但是我没有把它写进例程中,所以上面的程序只会输出搜索结果;下一步再调用addxqlresultlistener()方法,并传递search的一个实例,用来实现xqlresultlistener的接口;然后再把查询字符串作为一个参数来调用setquery方法,引擎就会开始执行查询任务。等到查询结束后,引擎调用search类的result()方法,把查询结果传回,在我提供的例程中,result()方法只是简单的把结果输出出来。
代码:
| import java.io.*; import com.fatdog.textengine.xmlengine; import com.fatdog.textengine.exceptions.*; import com.fatdog.textengine.query.xqlresultlistener; public class search implements xqlresultlistener { public static void main( string[] args ) { xmlengine engine = new xmlengine(); string searchfile = args[0]; string searchtype = args[1]; string query = args[2]; try { file://配置引擎 engine.setsaxparsername( "org.apache.xerces.parsers.saxparser"); engine.setminindexablewordlength( 3 ); engine.setdoindexnumbers( false ); engine.setdocument( searchfile ); if (searchtype.equals("1")) { engine.setlistenertype( xmlengine.standard_listener); } else if (searchtype.equals("2")) { engine.setlistenertype( xmlengine.summary_listener); } else { engine.setlistenertype( xmlengine.csv_listener); } } catch( missingorinvalidsaxparserexception e ){ system.out.println( "缺少或不可用的 sax解析器" ); return; } catch( filenotfoundexception e ) { system.out.println( "不能找到 xml 文件: "); return; } catch( cantparsedocumentexception e ) { system.out.println( "不能解析 xml 文件: "); return; } // engine.printsessionstats(); engine.addxqlresultlistener( new search() ); try { engine.setquery( query ); } catch( invalidqueryexception e ) { system.out.println( "不可用的查询请求: " + e.getmessage() ); return; } } public void results( string xqlresults ) { system.out.println( xqlresults ); } } |
| <org.apache.xerces.parsers.saxparser> installed successfully 1: indexing web.xml query: ( // ( / welcome-file-list welcome-file ) ) 3 hit(s) for file://welcome-file-list/welcome-file <?xml version="1.0"?> <xql:result query="//welcome-file-list/welcome-file" hitcount="3" elemcount="3" doccount="1" xmlns:xql="http://www.fatdog.com/ standard_listener.html"> <welcome-file> index.jsp </welcome-file> <welcome-file> index.html </welcome-file> <welcome-file> index.htm </welcome-file> </xql:result> |
c:\xql\xql1>java search web.xml 2 "//welcome-file-list/welcome-file" parser.installsaxparser: <org.apache.xerces.parsers.saxparser> installed successfully 1: indexing web.xml query: ( // ( / welcome-file-list welcome-file ) ) 3 hit(s) for file://welcome-file-list/welcome-file <?xml version="1.0"?> <xql:result query="//welcome-file-list/welcome-file" hitcount="3" elemcount="3" doccount="1" xmlns:xql="http://www.fatdog.com/ summary_listener.html"> <welcome-file xql:docid="0" xql:elemix="270"/> <welcome-file xql:docid="0" xql:elemix="271"/> <welcome-file xql:docid="0" xql:elemix="272"/> </xql:result> |
| c:\xql\xql1>java search web.xml 3 "//welcome-file-list/welcome-file" parser.installsaxparser: <org.apache.xerces.parsers.saxparser> installed successfully 1: indexing web.xml query: ( // ( / welcome-file-list welcome-file ) ) 3 hit(s) for file://welcome-file-list/welcome-file 3,3,1,0 0,270,welcome-file 0,271,welcome-file 0,272,welcome-file |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器