学习使用XML引擎XQEngine

最近我一直在寻找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 );
}
}


 
  好,我们已经把一个使用XQEngine的程序编写出来了,那么就让我们来运行这段代码,在编译这段代码之前,我们需要下载到XQEngine和SAX解析器。我是从xml.apache.org上下载到Xerces解析器的。我使用的操作系统是Windows 2000 Professional,JDK为1.3版,好,搞定这些以后就跟我来设置CLASSPATH吧,在"环境变量"中修改CLASSPATH,添加"c:\xql\XQEngine.jar;c:\xql\antlr.jar; c:\xerces\xerces.jar"。现在就可以编译代码了,不过为了能够运行程序,我们还需要一个XML文件,我使用了Apache Tomcat里的web.xml文件作为演示。前面我也介绍过了,我们使用1,2,3来分别代替三种返回查询结果格式:

  1、使用STANDARD_LISTENER (数字1)和查询项"//welcome-file-list/welcome-file",C:\xql\xql1>java Search web.xml 1 "//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/ Standard_Listener.html">
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file>
</xql:result>

  上面的例子中,查询项要求找到任何"welcome-file-list"元素的所有的"welcome-file"子元素。请注意,搜索的结果基本上是从原XML文档中摘录出来的,不能够建立搜索结果和原文档之间的关系。SUMMARY_LISTENER(2)返回类型则有些不同,它包括一个"docID"号和一个"elemlx"号,这样就能够把结果和原文档联系起来了。

  如下是返回结果的示例:


  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>


  我前面也说过,对于我的应用程序来说,最重要的是返回使用逗号隔开的返回结果,所以CSV_LISTENER(3)就很有用了,它能够返回一个使用使用逗号隔开的结果,如下:

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


  当然,XQEngine还有很多很强大的功能,在此我不可能一一介绍,它所附带的文档中有丰富的源程序和使用方法,你可以对照着自己学习使用,当然,如果你愿意的话你甚至还可以开发出一个GUI程序,文档中就自带了一个基于GUI的搜索程序:SwingQueryDemo,你可以看一看研究研究。

(0)

相关推荐

  • 学习使用XML引擎XQEngine

    最近我一直在寻找XML搜索工具,我编写的应用程序需要定期的搜索一些有关联的XML文件,我本来的意思是为了看一看文件中是否有与我想要的数据匹配的数据,但是有时候,我也想把找到的这些数据输出出来.一开始,我试用了一下XSLT和XPath,想通过把搜索的问题转化成使用XSLT能够解决的问题,但是经过一段时间的试验,我发现,使用XSLT并没有真正解决我想要处理的搜索问题,因为我想要输出的数据是使用逗号隔开的数,而XSLT不能满足这个要求,而且XLST也不能提供全文搜索功能.然后我想尝试一下使用XML查询

  • 关于SQLServer2005的学习笔记 XML的处理

    关于 xml ,难以理解的不是 SQLServer 提供的函数,而是对 xml 本身的理解,看似很简单的文件格式,处理起来却是非常困难的.本文只是初探一下而已. 详见 SQLServer 联机帮助: 主题 说明 query() 方法( xml 数据类型) 此方法用于对 XML 实例进行查询. value() 方法( xml 数据类型) 此方法用于从 XML 实例检索 SQL 类型的值. exist() 方法( xml 数据类型) 此方法用于确定查询是否返回非空结果. modify() 方法( x

  • springboot学习之Thymeleaf模板引擎及原理介绍

    目录 模板引擎 什么是模板引擎? 模板引擎的原理 引入Thymeleaf Thymeleaf分析 Thymeleaf语法学习 模板引擎 springboot我们目前是以jar包的形式打包,实际上我们之前是打成war包,放到tomcat服务器里面,可以用JSP.但是jar包就导致不能用JSP,换一种方式就是springboot推荐的Thymeleaf模板引擎(JSP也是一种模板引擎,除此之外还有什么framework也是一种模板引擎), 什么是模板引擎? 模板引擎就是解决我们需要动态赋值给前端的一

  • 详述 tomcat 中的 server.xml 配置文件示例

    正文 1 前言 Tomcat 隶属于 Apache 基金会,是开源的轻量级 Web 应用服务器,使用非常广泛.server.xml是 Tomcat 中最重要的配置文件,server.xml的每一个元素都对应了 Tomcat 中的一个组件:通过对 XML 文件中元素的配置,可以实现对 Tomcat 中各个组件的控制.因此,学习server.xml文件的配置,对于了解和使用 Tomcat 至关重要. 本文将通过实例,介绍server.xml中各个组件的配置,并详细说明 Tomcat 各个核心组件的作

  • [PHP]模板引擎Smarty深入浅出介绍

    Smarty介绍 什么是模版引擎 不知道从什么时候开始,有人开始对 HTML 内嵌入 Server Script 觉得不太满意.然而不论是微软的 ASP 或是开放源码的 PHP,都是属于内嵌 Server Script 的网页伺服端语言.因此也就有人想到,如果能把程序应用逻辑 (或称商业应用逻辑) 与网页呈现 (Layout) 逻辑分离的话,是不是会比较好呢? 其实这个问题早就存在已久,从交互式网页开始风行时,不论是 ASP 或是 PHP 的使用者都是身兼程序开发者与视觉设计师两种身份.可是通常

  • 对比分析json及XML

    随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递.承担App与网络来进行传输和存储数据的一般是XML或者JSON.在移动互联网时代,XML和JSON很重要. 最近一段时间,个人综合了之前对XML.JSON的一些了解,参考了相关资料,再结合视频的代码,把自己的一些思考融入了这篇总结文档中,同时尝试用通俗诙谐的语言风格来阐述,期望能给感兴趣的读者带来帮助. 为了不和时代落伍,我们必须要学习 XML 和 JSON,但同时它们也很容易

  • XML入门的常见问题(二)

    作者:AngelGavin  出处:CSDN Internet Explorer 5.0 对 XML 提供哪个级别的支持? Internet Explorer 5 提供下列 XML 支持: 直接查看 XML.Microsoft XML 实现允许用户通过他们的 Web 浏览器使用 XSL 或者层叠样式表 (CSS) 查看 XML,就象查看 HTML 文档一样. 高性能.验证 XML 引擎.Internet Explorer 4.0 开发人员熟悉的 XML 引擎已经得到了很大的增强,并且完全支持 W

  • 为何XML对Web服务很重要

    Web服务经常从它的组件技术的角度来进行描述.SOAP.UDDI.WSDL.XML以及HTTP各自组成了Web服务体系的一部分,它们都发挥了重要作用.让我们看看XML技术对Web服务平台的贡献. 标准化 与其它Web服务技术相比,标准化是XML特色之一.XML提供了Web服务应用程序之间传输数据的标准格式.万维网联盟(W3C)管理XML标准并发布给全球的XML技术提供者,这就确保了XML产品的兼容性. 除了XML引擎和产品外还有XML文法(grammar).每一个XML语法都是一种在某个特定问题

  • 10分钟掌握XML、JSON及其解析

    引言 NOKIA 有句著名的广告语:"科技以人为本".任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务. 随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递.承担

  • JavaScript DOM学习第一章 W3C DOM简介

    在这一章我主要介绍已经被新一代的浏览器所支持的W3C 第一级的DOM.对他的运作做一个大概的了解并且让你知道你可以对他们做什么. 首先是对于DOM的一些建议和DOM设计的目的,然后我会告诉你什么是节点(nodes)并且怎样通过DOM树来遍历节点.接着是如何得到一个特定的节点,以及怎样改变他的值和属性.最后就是DOM的终极目标:怎么创建一个自己的新节点. 建议 Level 1DOM是W3C制定的用来提供给任何程序语言来访问XML文档的.不管你用什么语言程序来处理XML文档,只要是Level 1DO

随机推荐