2005年12月30日

1.客户端提交请求
Domain = " test.com"
sXml = "<?xml version=""1.0"" encoding=""gb2312"" ?>" &_
     "<Package>" &_
     "<Domain>" & Domain & "</Domain>" &_
     "</Package>"
 Set oD = Server.CreateObject("Microsoft.XMLHTTP")
 oD.Open "Post", "http://Server/Domain_Check.jsp", False
 oD.Send(sXml)
 
 If oD.Status = 200 Then
  Result = oD.responseText
  Set o = Server.CreateObject("Microsoft.XMLDOM")
  o.LoadXML(Result)
  
  Domain = CInt(o.selectSingleNode("//Result").text)
  Response.Write Domain
  Set o = Nothing
  Set oD = Nothing
 End If

2.服务器端解析数据包
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="java.io.*" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="javax.xml.parsers.*" %>
<%@ page contentType="text/html; charset=gbk" %>
<%
 //获得数据包
 request.setCharacterEncoding("UTF-8");
 BufferedReader in = request.getReader();
 String line;
 String xmlRequest = "";
 String domain_name = "";
 
 while ((line = in.readLine()) != null)
 {
  //构造数据包
  xmlRequest = xmlRequest + line + "\n";
 }
 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 DocumentBuilder db = factory.newDocumentBuilder();
 ByteArrayInputStream stream = new ByteArrayInputStream(xmlRequest.getBytes("UTF-8"));
 Document doc = db.parse(stream);
 Element root = doc.getDocumentElement();

 NodeList Domain = root.getElementsByTagName("Domain");
 if (Domain.getLength() == 1) {
  Element e = (Element) Domain.item(0);
  domain_name = (String) e.getFirstChild().getNodeValue();
 }
//返回数据
 out.println("<?xml version=\"1.0\" encoding=\"gb2312\" ?>\n");
 out.println("<Package>\n");
 out.println("\t<Result>" + domain_name + "</Result>\n");
 out.println("</Package>");
%>

3.得到返回结果
test.com

引言
  
  大家都知道可以通过post或者get获得form表单的数据,那么我们如何实现不刷新的提交直接获得页面上的数据呢?这就要借助xmlhttp协议了。xmlhttp是xmldom技术的一部分。
  
  下面的代码就是一个很简单的例子,我们利用xmlhttp技术实现简单的用户登陆。
  
  开始
  
  1.简单的登录页面
  
  login.jsp
  function toServer(){
  var xml = "<root>"+
  "<name>"+document.all(‘name’).value+"</name>"+
  "<pwd>"+document.all(‘pwd’).value+"</pwd>"+
  "</root>";
  
  var XMLSender = new ActiveXObject("Microsoft.XMLHTTP" );
  XMLSender.Open("POST",’do_login.jsp’,false);
  XMLSender.send((xml));
  alert(XMLSender.responseText); //可处理后台返回的结果
  }
  
  姓名:<input type="text" id="name" /><br>
  密码:<input type="text" id="pwd" /><br>
  <input type="button" value="登录" onclick="toServer()">
  
  2.后台的登录处理页面
  do_login.jsp
  
  <%
  //读取XMLHTTP流
  java.io.BufferedReader br = request.getReader();
  String str = "";
  while (str != null) {
  str = br.readLine();
  process (str); //可通过任何语言实现解析XML,进行业务处理
  }
  
  //返回信息
  javax.servlet.ServletOutputStream sos = response.getOutputStream();
  sos.print("login success" );
  sos.close();
  %>
  与传统的“提交-回发-重绘”式的web系统基本运行结构不同,我们可以通过通过XMLHTTP实现无刷新的客户端直接与服务器交互,极大的提高用户的感受度。
  
  查考资料
  
  XMLHTTP方法:
  
  Open bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword
  bstrMethod:数据传送方式,即GET或POST。
  bstrUrl:服务网页的URL。
  varAsync:是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。
  应用中一般将其置为False,即异步执行。
  bstrUser:用户名,可省略。
  bstrPassword:用户口令,可省略。
  
  Send varBody
  varBody:指令集。可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。也可以省略,让指令通过Open方法的URL参数代入。
  
  setRequestHeader bstrHeader, bstrValue
  bstrHeader:HTTP 头(header)
  bstrValue:HTTP 头(header)的值
  如果Open方法定义为POST,可以定义表单方式上传:
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  
  XMLHTTP属性:
  
  onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
  responseBody:结果返回为无符号整数数组。
  responseStream:结果返回为IStream流。
  responseText :结果返回为字符串。
  responseXML:结果返回为XML格式数据。

2005年12月29日

Hany Saleeb , 技术顾问, Freelance

2005 年 12 月 08 日

即使数据库没有自称支持 XML 特性,也可以在关系数据库中存储和检索 XML 文档。这样做需要小心地使用 Java™ 编程语言(数据库不一定兼容 Java Database Connectivity 或 JDBC),还需要一个框架来连接关系数据库和 XML 文档流。

将 XML 映射到数据库有两种常见的方法:基于表的映射和对象-关系(或基于对象的)映射。这两种方法都是双向的,因此可用于存储和检索 XML 文档。

基于表的映射

基于表的映射 将文档看作一个表或者一组表。清单 12 显示了这两种情况下的文档结构。


清单 1. 表映射的选项(单表)


   <Table ABC>
      <Row1>
         <Column_a>123-45-7890</Column_a>
         <Column_b>Johnson, Eric</Column_b>
         <Column_c> Pharmaceutical </Column_c>
      </Row1>
      <Row2>
         <Column_a>999-00-1010</Column_a>
         <Column_b>Mitchell, Bruce</Column_b>
         <Column_c> Industrial </Column_c>
      </Row2>
   </Table ABC>



清单 2. 表映射的选项(多表)


    <Tables>
      <Table_1>
         <Row1>
            <Column_a>123-45-7890</Column_a>
            <Column_b> Johnson, Eric </Column_b>
            <Column_c>Company A</Column_c>
         </Row1>
         <Row2>
            <Column_a>999-00-1010</Column_a>
            <Column_b> Mitchell, Bruce </Column_b>
            <Column_c> Company  B</Column_c>
         </Row2>
      </Table_1>
      <Table_2>
         <Row1>
            <Column_a>Company A</Column_a>
            <Column_b>Pharmaceutical</Column_b>
         </Row1>
         <Row2>
            <Column_a>Company B</Column_a>
            <Column_b>Industrial</Column_b>
         </Row2>
      </Table_2>
   </Tables>


这种映射最明显的优点是简单。因为结构与关系数据库的表及结果集匹配,根据这种映射编写代码很容易。代码执行快、伸缩性好,对某些应用很合适,比如每次一个表在数据库之间传递数据。

但是,基于表的映射也有一些不足之处。它只能用于非常小的 XML 文档子集。此外,它没有保留物理结构(即字符和实体引用、字符编码或独立的声明)、文档信息(即文档类型声明或 DTD)、注释和处理指令。


对象-关系映射

基于表的映射只能用于有限的 XML 文档,因此多数支持 XML 的关系数据库、大部分支持 XML 的对象服务器以及一些中间件工具使用更加复杂的映射,称为对象-关系映射。这种映射方法将 XML 文档建模为针对文档数据的一棵对象树,然后将这些对象映射到数据库。

比如 清单 3 所示的 XML 文档。


清单 3. XML 格式的单个销售订单


   <SalesOrder>
      <Number>1234</Number>
      <Customer>Gallagher Industries</Customer>
      <Date>29.10.00</Date>
      <Item Number="1">
         <Part>A-10</Part>
         <Quantity>12</Quantity>
         <Price>10.95</Price>
      </Item>
      <Item Number="2">
         <Part>B-43</Part>
         <Quantity>600</Quantity>
         <Price>3.99</Price>
      </Item>
   </SalesOrder>


该文档映射为 清单 4 所示的对象。


清单 4. 层次化 XML 表示的单个销售订单


      object SalesOrder {
         number = 1234;
         customer = "Gallagher Industries";
         date = 29.10.00;
         items = {ptrs to Item objects};
      }         /             \
               /               \
              /                 \
   object Item {       object Item {
      number = 1;         number = 2;
      part = "A-10";      part = "B-43";
      quantity = 12;      quantity = 600;
      price = 10.95;      price = 3.99;
   }                   }


该方法是层次化的,对数据映射来说很直观。数据库对象带来了一些优点,其中包括:

  • 数据库独立性:数据库对象从根本上是独立于数据库创建的,不依赖于特定底层数据特性来提供其功能。这种独立性使您可以使用数据库对象迅速将应用程序构建从一种数据库平台转移到另一种数据库平台,提供了很大的可伸缩性。
  • 自动化的连接处理:自动化连接处理能够连接、断开和管理系统资源。对客户机对象的抽象可以提供更好的控制和性能。
  • 声明性的引用完整性:通过直接在数据库对象中嵌入访问逻辑,可以获得和使用存储过程访问数据库同样的好处,而且不依赖于特定平台。引用完整性成了数据库独立性,数据库对象之间的复杂关系成了可移植性。比如,可以在数据库对象中集成业务规则,让访问该对象的所有应用程序都保证遵守这些规则。
  • 多层验证:可以在对象或者其父对象上执行检查。这样就可以规范和验证访问、权限以及数据完整性。
  • 避免内嵌 SQL:使用数据库对象可以使应用程序避免内嵌 SQL 及其维护的困难和系统依赖性。如果应用程序只与其他 Java 对象交互,系统的设计就可以是完全面向对象的。
  • 安全:可以确保与数据库对象的任何交互的安全,并容易地保证数据安全。


映射方法论

实现对象-关系映射需要两步。首先将 XML 模式(这里使用 DTD)映射到对象模式,然后将对象模式映射到数据库模式。也可以将这两种映射合并成一个 DTD 到数据库的映射,现在多数软件都是这样做的。

表 1 中的例子显示的简单元素类型 BDE 被映射到字符串,而复杂元素类型 AC 被映射到类。在对象-关系映射的第一部分,AC 的模型和属性被映射到类 AC 的属性。AC 的内容模型中对 BDE 的引用被映射为字符串。

表 1. 对象关系映射,第 1 部分
DTD
<!ELEMENT A (B, C)> <!ELEMENT B (#PCDATA)> <!ELEMENT C (D, E)> class A { String b; C c; }
<!ELEMENT D (#PCDATA)> <!ELEMENT E (#PCDATA)> class C {String d; String e; }

对象-关系映射的第二部分(参见表 2)中,类映射到表,标量属性映射到列,指针/引用属性映射到主键/外键关系。A 的内容模型中对 C 的引用被映射到 pointer/reference 类型的属性,指向类 C 的对象,因为元素类型 C 被映射到类 C

表 2. 对象关系映射,第 2 部分
class A {String b; C c; } Table A: Column b Column c_fk
class C {String d; String e; } Table C: Column d Column e Column c_pk


结束语

两种映射都是对 XML 文档中的数据 而不是对文档本身建模。因此映射更适合于以数据为中心的文档而不是以文档为中心的文档。虽然对象-关系映射是采用面向对象的技术,但是也不够理想。基于表的映射根本不能处理混合内容,而从性能的角度看对象-关系映射可能效率很低。使用哪种方法都行,但是必须记住这些警告。


参考资料

学习


讨论

文/范之望)

长期以来,IT业界一直在寻求新型数据库系统以弥补经典的关系数据库的不足。本文试图从数据库发展的历史、企业界的战略考虑以及近年来出现的XML语言的重要意义,来简单介绍德国软件股份公司(Software AG)在数据库技术上的新思维。

 

数据库系统发展历史及对新型数据库的寻求

 

  自六十年代商用数据库系统面世以来,数据库系统的发展大概经历了以下几个阶段:

七十年代以前,数据库系统并没有一个完整和坚固的数学理论基础,数据库产品直接按实际应用的要求来设计。这段时期的数据库产品以层次型数据库系统为主。业界把这段时期的产品称为“前关系型数据库系统(pre-relational database)”时期。

 

1970年,IBM公司的研究员Codd发表了题为《大型数据库的数据关系模型》①著名文章。从此,数据库系统的发展进入了“关系型数据库系统(relational database)”时期。关系型数据库系统以关系代数为坚实的理论基础,经过几十年的发展和实际应用,技术越来越成熟和完善。其代表产品有Oracle、IBM公司的DB2、 微软公司的MS SQL Server以及Informix、ADABASD等等。

 

随着信息技术和市场的发展,人们发现关系型数据库系统虽然技术很成熟,但其局限性也是显而易见的:它能很好地处理所谓的“表格型数据”,却对技术界出现的越来越多的复杂类型的数据无能为力。九十年代以后,技术界一直在研究和寻求所谓的“后关系型数据库系统(post-relational database)”。尤其是九十年代中后期,世界著名的产业战略调查咨询公司Gartener Group发表了一系列关于数据库系统发展的调研报告,其重点归纳起来大概有以下几点:

 

l       关系型数据库系统技术已相当成熟,其发展已趋顶峰;

l       尽管有了很大发展,关系型数据库系统能处理的数据类型仍相当有限;

l       随着信息技术的发展,市场越来越需要能处理复杂数据类型的数据库;

l       由于大型数据库管理系统的技术复杂性以及开发的高昂费用,今后新型数据库系统很可能只在现有的数据库系统产品厂家内产生。

 

Gartner Group的报告引起了IT业界的高度重视。但在什么是新型数据库系统的发展方向的问题上,产业界一度是相当困惑的。受当时技术风潮的影响,在相当一段时间内,人们把大量的精力花在研究“面向对象的数据库系统(object oriented database)”或简称“OO数据库系统”。值得一提的是,美国Stonebraker教授提出的理论曾一度受到产业界的青睐。Stonebraker在其著作《面向对象的关系型数据库系统:未来的巨浪》②指出:

 

l       纯关系型数据库系统市场已逐渐饱和;

l       纯面向对象型数据库系统除一些特殊用途外,市场极其狭小;

l       面向对象的关系型数据库才是新型数据库系统的发展方向。

 

Stonebraker不仅对现有的数据库类型及市场进行了详尽的分析,提出了“面向对象的关系型数据库” 的基本思想,更难能可贵的是还提出了一系列具体技术实施的方法。比如,他提出的不放弃已经非常成功的查询语言SQL,而直接在SQL语言上进行功能扩展。 Stonebraker的著作一面世立即受到了研究界和工业界高度重视,新版本的SQL3标准(99年发表)正是引进面向对象的关系型数据库的许多内容。而Stonebraker本人也在当时被Informix花大价钱聘作技术总负责人。

 

然而,数年的发展表明,面向对象的关系型数据库系统产品的市场发展的情况并不理想。理论上的完美性并没有带来市场的热烈反应。笔者以为,其不成功的主要原因在于,这种数据库产品的主要设计思想是企图用新型数据库系统来取代现有的数据库系统。这对许多已经运用数据库系统多年并积累了大量工作数据的客户,尤其是大客户来说,是无法承受新旧数据间的转换而带来的巨大工作量及巨额开支的。另外, 面向对象的关系型数据库系统使查询语言变得极其复杂,从而使得无论是数据库的开发商家还是应用客户都视其复杂的应用技术为畏途。 

 

Internet的异军突起以及XML语言的出现,给数据库系统的发展开辟了一片新的天地。九十年代末,随着德国软件股份公司(Software AG)宣布世界上第一个“原状XML数据库系统(Native XML Database System)”产品──Tamino问世,标志着数据库系统进入了新的一个的发展时期。随后,一些大型数据库系统生产厂家,如:甲骨文、微软公司等纷纷宣布要发展支持XML的数据库产品。

 

XML:Internet技术上的一次新革命

 

XML的全称是“可扩展的标识语言(extensible markup language)”。1998年2月W3C组织公布了XML第一版本的标准③,从此Internet技术进入了一个新的革命。如果说以http传输协议 和超文本标识语言HTML为标志是第一代Internet技术的话,那么,围绕着XML所形成的一系列标准和技术将构成新一代的Internet技术。世 界上几乎所有的大型IT公司都在跟踪和研究开发XML产品。

 

为什么XML技术如此重要?事实上,我们只要回顾一下IT行业的发展历史就不难理解其中的意义。

 

当计算机技术摆脱纯科学计算而转入商业用途之后,在其通用软件的发展上大约经历了以下几个阶段:

 

第一阶段,IT业界大多把研发的重点放在办公室桌面自动化上,主要是解决与办公文件有关的一系列处理软件,追求所谓“无纸办公自动化”。这方面的代表产品有美国微软公司的MS Office等。

 

IT发展的第二阶段,以公司企业内部的计算机管理自动化为方向,解决的是企业内部各职能部门内部的管理及部门与部门之间的协调问题,即ERP系统。这方面的典型产品以德国SAP公司的产品为代表。相对于办公室桌面自动化来说,企业管理所涉及的面更广、问题更复杂。

自从Internet被引入商业用途以后,IT的发展进入了第三个阶段:即企业与企业间、实体与实体间业务交流的自动化,这种交流的自动化不仅仅是局部性的,更是区域的乃至全球性的。这个阶段的发展无论从其广度和复杂程度都要大大超过前两个阶段,它带来的革命性意义也将是十分深刻的。电子商务、B2B等等前几年炒作相当热的概念就是这个阶段发展的一部份。电子商务之所以时至今日尚未发展出一个统一的解决方案,依笔者之见,主要是作为电子商务的基础技术发展尚未成熟,而且市场也需要一个酝酿期。

 

经过这几年的研究和探索,虽然尚未发展出一个统一的方案来解决企业与企业间业务交流的自动化的问题,但在其基础技术上各业界几乎已经统一了思想:解决方案必须在跨操作平台、跨软件系统的Internet平台上进行,其基础技术就是XML。

 

虽然XML与HTML都属标识语言,但他们的意义却是完全不同的。HTML文件中的标识符仅表示该文件应该如何显示(如字体的大小等等),而对机器来说极 难判断其表达的语义。文件中表达意义完全需要人通过对文字的阅读才能理解。而XML则不同,它所采用的标识符本身就代表了语义结构,文件的具体语义完全可 以通过对语义结构的分解及该结构内变量值或字符的分析由机器来解释。因此,我们可以用通俗的话来概括HTML与XML的差别:

 

“HTML是写给人看的;而XML则是写给机器看的。”

 

扼要地说,XML有下列重要特性: 

 

l       XML是一种表意而非表形的元语言。采用不同的显示页(stylesheet)就可以做到同一数据源却有不同途径的显示结果。

 

l       XML是Internet的标准语言,因而具有跨操作平台、跨区域的特点,因而是网络世界里的一种“世界语”。

 

l       由于由XML所写的文件能为机器所解读,使得网络世界里“服务器对服务器(Server to Server)”的应用成为可能,从而奠定了Internet应用自动化的基础。

 

l       XML是一种可自我描述定义的元语言(self description meta language),所以它将大量用于制定行业内及行业间数据交换的标准。

 

围绕着XML已经形成了一大批新的技术及标准。工业界也在加紧制定自己行业的XML标准。关于这些新型技术和标准,我们将另行撰文详细讨论。目前,XML 数据已逐渐用于实际应用。可以预见,今后的一段时间内,XML数据将爆炸性地递增而出现在Internet世界里。XML数据的大量应用在呼唤着新型数据库系统的面世。

 

原生XML数据库系统和Tamino

 

在发展XML数据库上,存在着两种完全不同的方法。第一种方法是在不变动关系型数据库内核层的基础上,将XML的树型结构数据拆散、重组转换成关系型表格数据存入数据库。在提取XML数据时,利用SQL语言的优化将库内的表格型数据取出并还原成XML结构型数据。文献④详细讨论了有关表格型数据与XML数据的转换及优化的问题。第二种方法,也是被业界普遍认为是代表发展方向的方法,就是发展“原生XML数据库系统(Native XML Database)”。这一概念由德国软件股份公司(Software AG)首次提出并实施于其新型数据库Tamino之中。在这一数据库系统中,从数据库核心层直至其查询语言都采用与XML直接配套的技术。我们在这里介绍Tamino主要设计思想及技术。 

 

德国软件股份公司(Software AG)是欧洲第二大具有大型独立品牌软件产品的公司,具有三十多年以生产数据库系统产品为主的历史,她的传统产品ADABAS是一大型数据库管理系统,被用于西班牙国防部、美国的一些地区政府等安全要求严,敏感性高、客用量大、系统稳定性要求高的业务。在XML标准尚在讨论而未正式发表之时,Software AG即从战略发展的高度制定出发展支持XML数据的数据库系统,并率先在世界上第一次提出“原生XML数据库系统(Native XML Database)”的概念,并于99年10月推出新型数据库系统Tamino。

 

在这短短的几年中,Tamino已发展到第三个版本。相对于传统的关系型数据库管理系统来说,这是一种结构完全不同、设计思想新颖的全新的数据库系统。概括来说:

 

l       “原生XML数据库系统”无需转换

 

如果用关系型数据库来处理XML数据,将需要一系列复杂的转换工作,从而极大地影响应用的速度。更有甚者,当转换选择不合理时,很有可能对应用造成致命的伤害。而原状XML数据库系统则不同,XML数据不经任何转换而按原结构形状直接存入数据库内,因而对XML的应用来说是最优的。

 

l       快速的XML信息服务器(XML Information Server)

 

原状XML数据库系统对于XML应用其速度相对于其他数据库来说要快得多。对于相同的XML数据,Tamino的处理速度比其他数据库快数十倍乃至上百倍。

 

l       Tamino可处理XML数据也可处理关系型数据

 

Tamino带有两个不同的数据处理器。一是所谓的“X-机器(X-Machine),专门用来处理XML数据的检测、存储及提取。其次是SQL引擎,用来处理关系型数据。这两部分处理器各自带有自己的编程接口。

 

l       Tamino直接支持http传输协议

 

通常的数据库系统只是简单的client/server结构。如果要投入到Internet的应用中,则需要另外在Webserver与数据库之间写一层接口程序,以保证Internet的应用中数据交换的实现,而这一部分的编程工作量相当大且复杂。Tamino的X-Machine直接支持http传输协议,只要输入相应的URL,就可以直接取得或处理XML数据。

 

l       Tamino的XML查询语言—Xquery

 

众所周知,查询语言是数据库系统的一个重要部分。由于XML数据与关系型数据的结构完全不同,设计思想也不一样,因此要真正应用XML数据库, 就要放弃SQL而采用新型的查询语言。W3C组织发布了一系列有关XML查询语言的建议标准,并对外公布(见http: www.w3c.org/xml)。Tamino采用的是XQuery语言。该语言是基于http的请求基础上的,也就是说当在浏览器上敲入或在应用程序 内输入一条含有XQuery内容的URL,用户将得到相应的带有XML结构的数据。

 

l       面向市场需求的X-Node技术。

 

X-Node是一种设计思想非常新颖的技术。Tamino的宗旨并不是取代现有的数据库系统,而是能集合已有数据库系统共同来完成Internet的XML应用。具体地说,如果某XML文件,其单元数据分别来自不同的数据库系统。这时可将Tamino放置前端,利用X-Node技术将Tamino与其它数据库系统(包括关系型数据库)相联。具体应用时,Tamino分别从不同的数据库内提取数据并连同自己库内的数据形成一个XML数据对象送入Internet世界中去。

 

XML技术及XML数据库系统是非常新的、大有发展前途的技术。中国IT行业要尽快进入发展的前列,应尽快加紧XML和XML数据库系统及其应用的研究和开发。

RSS是一种用于共享新闻和其他Web内容的数据交换规范,起源于网景通讯公司的推"Push"技术,将订户订阅的内容传送给他们的通讯协同格式(Protocol)。RSS可以是以下三个解释的其中一个:

  • Really Simple Syndication(真正简单的整合)
  • RDF (Resource Description Framework) Site Summary
  • Rich Site Summary(丰富站点摘要)

但其实这三个解释都是指同一种Syndication的技术。

目前RSS规范的主要版本有0.91、1.0和2.0。

0.91版和1.0版完全不同,风格不同,制定标准的人也不同。0.91版和2.0版一脉相承。1.0版更靠拢XML标准。

RSS目前广泛用于blogwiki和网上新闻频道,世界多数知名新闻社网站都提供RSS订阅支持。


目录

RSS规范

RSS阅读器

专用阅读器

附加阅读器

RSS在线阅读器

一些中文RSS搜索引擎

Google的XML数据格式定义:http://www.google.com/google.dtd

其它一些关于XSLT的演示文档:

XSL Tutorial 一个XSL教程,也是一个很好的XSLT在线手册:包括 XPATH XSLT函数参考和示例

其他在线文档和演示:

更多:http://www.google.com/search?q=filetype%3Appt+xslt

XSLT XPATH函数速查卡片
XSLT 速查卡片

更多XSLT在线指南

XooMLe: Google的XML接口(base on PHP)

PPT下载:google_xml_xslt.ppt

Google的XML数据格式定义:http://www.google.com/google.dtd

其它一些关于XSLT的演示文档:

XSL Tutorial  一个XSL教程,也是一个很好的XSLT在线手册:包括 XPATH XSLT函数参考和示例

其他在线文档和演示:

更多:http://www.google.com/search?q=filetype%3Appt+xslt

XSLT XPATH函数速查卡片
XSLT速查卡片

更多XSLT在线指南

XooMLe: Google的XML接口(base on PHP)

TODO:

Lucene做一个基于GET + XML方式的应用演示

英文原版请参见http://blogs.law.harvard.edu/tech/rss

  RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Site Summary的缩写,1.0与2.0走的是两个体系)
  RSS 基于XML,所有的 RSS 必须遵循w3c网站上公布的XML 1.0 规范。
  在一个RSS文档中,根元素是<rss>,带有一个必备属性version,用以指明该文档遵循的rss规范,如果rss文档遵循本规范,则version值必须是2.0。
  <rss>元素只有一个子元素,包含关于频道的一些信息。频道(channel)是整个blog,项(item)指一篇文章或日志(也有称这为post)。


RSS2.0元素channel的子元素列表



元素(Element) 描述(Description) 值域 重要性 举例(Example)
title 频道名称 必备 GoUpstate.com News Headlines
link 频道的URL 必备 http://www.goupstate.com/
Description 频道的描述 必备 The latest news from GoUpstate.com, a Spartanburg Herald-Journal Web site.
language 频道文章所用语言, 可用netscape或w3c推荐的列表 可选 en-us
copyright 频道内容的版权说明 可选 Copyright 2002, Spartanburg Herald-Journal
managingEditor 责任编辑的email 可选 geo@herald.com (George Matesky)
webMaster 负责频道技术事务的网站管理员email 可选 betty@herald.com (Betty Guernsey)
pubDate 频道内容发布日期,格式遵循RFC822格式(年份可为2们或4位) 可选 Sat, 07 Sep 2002 00:00:01 GMT
lastBuildDate 频道内容最后的修改日期 可选 Sat, 07 Sep 2002 09:42:31 GMT
category 指定频道所属的一个或几个类别 可选 <category>Newspapers</category>
generator 生成该频道的程序名 可选 MightyInHouse Content System v2.3
docs 指向该RSS文件所用格式说明的URL 可选 http://blogs.law.harvard.edu/tech/rss
cloud Allows processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds. More info here. 可选 <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/>
ttl 有效期,用以指明该频道可被缓存的最长时间 分钟为单位 可选 <ttl>60</ttl>
image 指定一个 GIF或JPEG或PNG图片,用以与频道一起显示 可选
rating 这个频道的分级(主要指成人、限制、儿童等) 可选
textInput 指定一个text输入框供用户输入,具体信息及功能未定。 可选
skipHours 提示新闻聚合器,那些小时时段它可以跳过。 可选
skipDays 提示新闻聚合器,那些天它可以跳过。 可选

RSS2.0元素channel的子元素image的子元素列表



元素(Element) 描述(Description) 值域 重要性 举例(Example)
url 图片的url 必备
title 图片的标题,用于http的alt属性 必备
link 网站的url(实际中常以频道的url代替) 必备
width 图片的宽度(象素为单位) 最大144,默认88 可选
height 图片的高度(象素为单位) 最大400,默认31 可选
description 用于link的title属性 可选



RSS2.0元素channel的子元素cloud的子元素列表



元素(Element) 描述(Description) 值域 重要性 举例(Example)
domain Cloud程序所在机器的域名或IP地址 radio.xmlstoragesystem.com
port 访问clound程序所通过的端口 80
path 程序所在路径(不一定是真实路径) /RPC2
registerProcedure 注册的可提供的服务或过程 xmlStorageSystem.rssPleaseNotify
protocol 协议 xml-rpc, soap , http-post 之一 xml-rpc



RSS2.0元素channel的子元素textInput的子元素列表



元素(Element) 描述(Description) 值域 重要性 举例(Example)
title Submit按钮的标签 必备
description 解释text输入区 必备
name Text area对象的名字 必备
link 处理提交的请求的cgi程序 必备

2005年12月28日

首先去下载个rsslibj的包:
http://sourceforge.net/project/showfiles.php?group_id=71153
参考官方网站的例子程序
import com.rsslibj.elements.Channel;
public class Writer {
public static void main(String[] args)
throws InstantiationException, ClassNotFoundException,
IllegalAccessException {
Channel channel=new Channel();
channel.setDescription("This is my sample channel.");
channel.setLink("http://localhost/");
channel.setTitle("My Channel");
channel.setImage("http://localhost/",
"The Channel Image",
"http://localhost/foo.jpg");
channel.setTextInput("http://localhost/search",
"Search The Channel Image",
"The Channel Image",
"s");
channel.addItem("http://localhost/item1",
"The First Item covers details on the first item>",
"The First Item")
.setDcContributor("Joseph B. Ottinger");
channel.addItem("http://localhost/item2",
"The Second Item covers details on the second item",
"The Second Item")
.setDcCreator("Jason Bell");
System.out.println("The feed in RDF: "+channel.getFeed("rdf"));
}
}
开始怀疑中文会有问题(老外的软件),测试了一下居然很好,什么问题也没有。
你要是熟悉rss文档格式,很容易编写一个标准的rss的writer出来

参考:rsslibj的主页 http://enigmastation.com/rsslibj/

肖菁, 软件工程师

2003 年 10 月 01 日

Web Services技术使异种计算环境之间可以共享数据和通信,达到信息的一致性。随着异种计算机环境的不断增加,我们会更加经常的调用各种不同计算机体系中编写和发布的Web Services,作者在本文中给出了使用VB应用程序调用java平台编写和发布的Web Services的实践过程, 并且分析了如何根据WSDL文件构造SOAP消息的方法。

一 SOAP简介

1.SOAP定义

SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议.

它包括四个部分:

  1. SOAP封装(envelop): 封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
  2. SOAP编码规则(encoding rules): 用于表示应用程序需要使用的数据类型的实例;
  3. SOAP RPC表示(RPC representation): 表示远程过程调用和应答的协定;
  4. SOAP绑定(binding): 使用底层协议交换信息。

2.SOAP消息

SOAP采用了已经广泛使用的两个协议:HTTP和XML。其中HTTP用于实现SOAP的RPC风格的传输,而XML是它的编码模式,一个SOAP请求实际上就是一个HTTP POST请求。

其它详细的SOAP方面的信息请参考 http://www.w3.org/TR/2001/WD-soap12-20010709/


二 WSDL简介

WSDL (Web Services Description Language)是一种XML Application,他的作用是将一个Web Services描述为一组服务访问点.

WSDL文档将一个Web Services描述成一组网络端点或者端口,在WSDL中,由于服务访问点和消息的抽象定义已经和具体的服务期部署和数据格式绑定分离,因此可以再次使用这些抽象对象: 消息,是对需要交换信息的抽象描述;端口类型,是对Web Service提供的操作的抽象集合。

特定端口类型的具体协议和数据格式定义构成了一个可以从用的绑定,一个端口定义成一个可重用绑定和网络地址的关联,一组端口构成了一个服务。

WSDL在定义Web Sevices时使用了以下元素:

  • Types: 数据类型的容器,他采用一些类型系统(比如常用的XSD)
  • Message: 通信消息的抽象类型化定义
  • Operation: 服务提供的操作的抽象化描述
  • Port Type: 一个或者多个端点支持的一组操作的抽象
  • Binding: 特定端口类型的具体协议和数据格式定义
  • Port:定义为binding和网络地址的关联的单个的端点
  • Service: 一组相关的端点的结合

详细的WSDL定义和相关信息请参考: http://www.w3c.org/TR/wsdl


三 使用WSAD开发和发布一个Web Services


1.我们用WSAD(Websphere Studio Application Developer)创建一个HelloWorld的java类,他只有一个方法,就是返回一个字符串HelloWorld。



// HelloWorld.java

package hello;

public class HelloWorld {
  public String getString(){
    return "Hello World!";
  }
}


2.将该类作为web service 发布到WASD带的测试环境的服务器上

发布后我们可以在web工程的wsdl文件下面找到两个.wsdl文件: HelloWorld-service.wsdl, HelloWorld-binding.wsdl,HelloWorld-binding.wsdl文件中主要描述了这个web services的服务访问点,HelloWorld-binding.wsdl文件中则描述了这个web services的通信消息的数据结构、每个访问点支持的操作、特定的断口类型的具体协议和数据格式规范的绑定等信息,其具体的含义可以参考使用 WSDL 部署 Web 服务:


第 1 部分(http://www-900.cn.ibm.com/developerworks/cn/webservices/ws-intwsdl/part1/index.shtml)一文 HelloWorld-service.wsdl的内容如下:



<?xml version="1.0" encoding="UTF-8"?>
<definitions name="HelloWorldService" targetNamespace="http://localhost:808/WForecast/wsdl/HelloWorld-service.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://localhost:808/WForecast/wsdl/HelloWorld-service.wsdl"
xmlns:binding="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <import namespace="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
  location="http://localhost:808/WForecast/wsdl/HelloWorld-binding.wsdl"/>
  <service name="HelloWorldService">
    <port name="HelloWorldPort" binding="binding:HelloWorldBinding">
      <soap:address location="http://localhost:808/WForecast/servlet/rpcrouter"/>
    </port>
  </service>
</definitions>



HelloWorld-binding.wsdl的内容如下:



<?xml version="1.0" encoding="UTF-8"?>
<definitions name="HelloWorldRemoteInterface"
targetNamespace="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <message name="getString">
    <part name="result" type="xsd:string"/>
  </message>
  <portType name="HelloWorldJavaPortType">
    <operation name="getString">
      <output name="getString" message="tns:getString"/>
    </operation>
  </portType>
  <binding name="HelloWorldBinding" type="tns:HelloWorldJavaPortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="getString">
      <soap:operation soapAction="" style="rpc"/>
      <output name="getString">
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:HelloWorld"/>
      </output>
    </operation>
  </binding>
</definitions>


3. 启动WSAD中的测试服务器


四 用VB编写客户端程序

1.环境准备

要使用SOAP消息访问Web Service消息。必须先下载MicroSoft公司提供的Soap ToolKit( http://download.microsoft.com/download/xml/soap/2.0/W98NT42KMe/EN-US/SoapToolkit20.exe

2.编写VB应用

打开VB,创建一个新的工程

其中的文本款用于显示返回的信息。

3.编写SOAP消息



<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance'
xmlns:xsd='http://www.w3.org/1999/XMLSchema'>
<s:Body>
<m:getString xmlns:m='urn:HelloWorld'>
</m: getString >
</s:Body>
</s:Envelope>


说明:
<m:getString xmlns:m=’urn:HelloWorld’>其中用到的" getString"就是HelloWorld-binding.wsdl中定义的defines-> portType->operation中定义的操作,而urn:HelloWorld则是HelloWorld-binding.wsdl中defines-> portType->operation->soap:body定义的namespace

4.显示处理结果

返回的结果也是一个XML消息,如下:



<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getStringResponse xmlns:ns1="urn:HelloWorld "
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:string">Hello World!</return>
</ns1:getStringResponse>

</SOAP-ENV:Body>
</SOAP-ENV:Envelope>.


我们需要使用ToolKit中的xml解析器对他进行解析才能获取我们需要的结果:



x.LoadXml responseXml

String s= x.getElementsByTagName("return").Item(0).Text

Text1.text=s


这样我们对web service的调用和处理过程就结束了,操作的结果图示如下:

5.整个事件的处理过程如下:



Private Sub Command1_Click()
'定义一个http对象,一边向服务器发送post消息
    Dim h As MSXML2.ServerXMLHTTP40
    '定义一个XML的文档对象,将手写的或者接受的XML内容转换成XML对象
 Dim x as MSXML2.DOMDocument40   

 '初始化XML对象
Set x = New MSXML2.DOMDocument40 

'将手写的SOAP字符串转换为XML对象
x.LoadXml "<s:Envelope
xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance'
xmlns:xsd='http://www.w3.org/1999/XMLSchema'>
<s:Body>
<m:getString xmlns:m='urn:HelloQuery'>
</m:getString>
</s:Body>
</s:Envelope>" 

'初始化http对象
Set h = New MSXML2.ServerXMLHTTP40

'向指定的URL发送Post消息
h.open "POST", "http://localhost:8080/WForecast/servlet/rpcrouter"
h.send (x)

While h.readyState <> 4
Wend

'显示返回的XML信息
Text1.Text = h.responseText

'将返回的XML信息解析并且显示返回值
x.LoadXml Text1.Text
Text1.Text = x.getElementsByTagName("return").Item(0).Text

End Sub




五 结束语

本文给出一个VB程序调用java平台编写的Web Services的实例,并且结合实例详细的分析了使用SOAP如何在异种计算平台之间调用Web Services通信和共享信息的过程.通过上面的实践,我们对使用SOAP调用Web Services的机制有了全面的了解.使用其它语言来实现SOAP调用Web Services的过程和方法和上面的过程大同小异,一般可以参照上面的过程来实现.


参考资料

使用工具:

内容摘要:
为Lucene做一个通用XML接口一直是我最大的心愿:更方便的在WEB应用中嵌入全文检索功能

  • 提供了XML的数据输入接口:适合将原有基于各种数据库的数据源导入到全文索引中,保证了数据源的平台无关性;
  • 通过了基于XML的搜索结果输出:方便了通过XSLT进行前台的结果显示;

MySQL \ / JSP
Oracle - DB - ==> XML ==> (Lucene Index) ==> XML - ASP
MSSQL / - PHP
MS Word / \ / XHTML
PDF / =XSLT=> - TEXT
\ XML
\_________WebLucene__________/
使用过程如下:
  1. 将数据用脚本导出成XML格式;
  2. 将XML数据源导入LUCENE索引;
  3. 从WEB界面得到XML结果输出,并通过XSLT生成HTML页面

站内全文检索的必要性

虽然大型搜索引擎的功能已经越来越强大了,很多站点都使用了Google的站内检索site:domain.com代替了自己的站内数据库“全文”检索。但依靠GOOGLE这样的大型搜索引擎做站内检索会有以下弊端:

  • 数量有限:搜索引擎并不会深度遍历一个网站,而将网站所有的内容都索引进去,比如Google就喜欢静态网页,而且是最新更新的,而不喜欢带?的动态网页,Google甚至会定期将缺少入口的网站内容逐渐抛弃;
  • 更新慢:搜索引擎针对站点的更新频率也是有一定周期的,很多内容需要一定时间后才能进入GOOGLE的索引:目前Google Dance的周期是21天左右;
  • 内容不精确:搜索引擎需要通过页面内容提取技术将导航条,页头页尾等内容过滤掉,反而不如直接从后台数据库提取数据来得直接,这种摘要和排重机制是很难实现的;
  • 无法控制输出:也许有更多的输出需求,按时间排序,按价格,按点击量,按类目过滤等

系统的搭建

下载:
http://sourceforge.net/projects/weblucene/

XML数据源的导入:

只要数据源可以导出成3层的XML结构,就都可以用IndexRunner这个命令行工具导入:

比如从数据库导出:news_dump.xml
<?xml version="1.0" encoding="GB2312"?>
<Table>
    <Record>
        <Title>标题</Title>
        <Author>作者</Author>
        <Content>内容</Content>
        <PubTime>2003-06-29</PubTime>      
    </Record>
    <Record>
        <Title>My Title</Title>
        <Author>chedong</Author>
        <Content>abc</Content>
        <PubTime>2003-06-30</PubTime>
    </Record>
    …
</Table>

IndexRunner -i news_dump.xml -o c:\index -t Title,Content -n Author
-i news_dump.xml:  以news_dump.xml为数据源
-o c:\index   索引库建立在c:\index目录下
索引建立Title Author Content PubTime这几个字段外,按以下规则建立索引:
-t Title,Content 一个进行分词的全文索引TokenIndex:数据是Title Content这2个字段
-n Author    一个不分词的索引:NoTokenIndex:数据源是Author这个字段。

对于RSS数据源:
<?xml version="1.0"?>
<rss version="0.92">
<channel>
  <title>Amazon: Books Arts &amp; Photography</title>
  <link>http://www.lockergnome.com/</link>
  <description>Amazon RSS Feed</description>
  <lastBuildDate>Sun, 29 Jun 2003 01:05:01 GMT</lastBuildDate>
  <docs>http://www.lockergnome.com/</docs>
  <webMaster>amazonfeed@lockergnome.com (Lockergnome RSS Generator)</webMaster>
  <item>
    <title>The Artist’s Way: A Spiritual Path to Higher Creativity – $11.17</title>
    <link>http://www.amazon.com/exec/obidos/ASIN/1585421464/lockergnomedigit/?ref=nosim&amp;dev-it=D34HUVGKB34YFX</link>
    <description>http://www.lockergnome.com/    </description>
  </item>
  …
</channel>

IndexRunner -i http://www.example.com/rss.xml -o c:\index -t title,description -n link  -l  4
-l 4 表示拿第4层节点作为字段映射,

IndexRunner还提供了-a -m这两个选项:用于增量索引和批量索引优化。
-a  增量索引,表示在原有索引的基础上扩展
-m  mergeFactor 在Lucene中mergeFactor是一个针对批量索引的优化参数,控制多少条处理完多少条记录(Document)后,写入一次索引,写入频率越高,内存使用越少,但索引速度越慢,所以在大批量数据导入时需要增大文件写入的间隔,多让索引在内存中操作。

搜索结果输出:


以下是系统设计过程中一些设计的思路:

做为工业标准的XML

记得以前有关于肯德基的炸薯条断顿的报道。从这个事件报道中我们可以看到一种更高效的管理体系:对于快餐店这样全球性的企业来说,要保证各地提供的薯条品质,成本最低的方法肯定是依靠机器而不是厨师,如果要求薯条机能够处理各种形状不一的土豆,机器的复杂程度和维护成本都会很高。所以土豆必须严格符合工业标准才能让结构比较简单的薯条机生产出符合标准的薯条,因此,薯条的加工机械会严格按照土豆协会的土豆工业标准设计。高质量的原料可以大大降低后期加工设备的成本,因此从总体成本上讲还是合算的。

对于软件应用开发者来说:应用和应用之间,企业和企业之间交换的数据好比就是土豆,白菜,按照严格的XML标准设计的接口作为企业之间后台数据交换的工业标准,虽然不如简单的CSV格式高效,但缺能大大简化下游工序的后期加工成本。

不难想象为什么处理HTML的浏览器:IE和Mozilla等浏览器软件大小都在10M以上,但一般处理XML的解析器一般都在几百K。除了没有界面外,HTML浏览器需要为太多不规范的HTML代码提供大量容错处理也是一个很重要的原因,而语法严格,规则简单的XML处理器就可以做的很简短,高效,体积越“小”就意味着适应性越广:这点在手机这样的硬件配置比较低的设备环境中显得尤其重要。

虽然XML在后台数据交换方面,有着巨大的潜力。在前台表现方面,XML并不会马上代替HTML,很多通过XSLT输出的HTML仍然需要结合CSS来进行表现。XML ==XSLT==> HTML + CSS。但是由于太多的网页都是用HTML做的,相信XML没有必要马上代替这些已有的机制。

此外在应用的国际化支持方面XML和Java简直是绝配:XML数据源用Java解析后是UNICODE,这样无论是日文,繁体中文还是德文的内容我们都可以在一个索引库中同时进行搜索。这样针对其他语言的支持只是设计各种语言界面的问题了。

      GBK          \                                       / BIG5
BIG5 - UNICODE ====> Unicode - GB2312
SJIS - (XML) (XML) - SJIS
ISO-8859-1 / \ ISO-8859-1

使用XML的另外一个额外好处在于:开发人员一般都没有仔细理解Java的字符集(其实上是JVM的缺省file.encoding属性)受系统本地化设置的影响,基于XML的输入使得数据的字符解码过程变得透明:不用再和用户解释需要如何解码,编码数据源。不过,XML的学习成本还是比较高的,假设你HTML的学习成本是1,XML则可能为10,而XSLT的学习成本则可能高达100。

传统数据库应用的全文检索加速

让数据库负责精确匹配,将模糊匹配用独立的系统实现

一个站点内容积累在万级以上,站内全文检索就会是用户定位最主要的手段,而关键词检索是用户最熟悉的方法。因此基于数据库的传统WEB应用在全文检索需求还是很大的。

但是可怕的%like%数据库操作可能会吃掉数据库服务器90%以上的CPU。Oracle MSSQL等数据库服务器中数据库内置的全文检索基本上都不太适合WEB应用。而数据库另外一个的弊端在于对于条件简单的查询返回结果集非常大:数据库并不知道如何面向用户最关心的的头100条结果进行优化。根据以前的统计:头100条结果往往已经可以满足95%以上用户需求。

需要缓存设计:根据我们的经验,在应用设计中没有必要进行内置的结果缓存设计:让前台的应用服务器内置的缓存机制或者反相代理缓存服务器进行缓存就够了。

数据同步策略

总体上讲,全文检索和数据库其实是2种根本不同的应用模式,全文检索系统其实往往也没有必要和数据库那么高的实时同步机制,如果按照:低更新,高缓存的模式进行设计:数据库数据到全文索引的同步过程一般都可以通过脚本定期将数据库的数据导出成XML,然后进入Lucene的全文索引。而针对原有数据记录的更新和删除,其实一般可以通过定期的重建索引解决。WebLucene其中索引部分是一个IndexRunner的命令行程序实现的。

结果排序策略

站内全文索引另外一个很重要的需求是可定制的排序:按时间,按价格,按点击量……Lucene全文索引缺省只提供了根据关键词在原文中的匹配度排序,而任何根据某个字段的值进行排序的都无法避免再次遍历数据,从而导致性能有数量级的下降(等于又是做%Like%检索),而在索引中,除了匹配度SCORE外,唯一能用来排序的就是索引记录的ID,所以一个比较高效率实现定制排序的方法时:在索引时,让进入Lucene全文的顺序对应着一定规则:比如时间,然后在搜索时,让搜索结果按照索引记录的ID进行排序(或倒排)。

搜索结果关键词标引的实现

搜索结果中关键词通过红色或者黑体字标记出来,为了能够更恰当的显示相关上下文的问题,标引是通过限制了一个扫描范围,然后根据一个分析器将指定的词流式的读取出来,然后

全文检索和其他应用的集成

其实核心的是一个Lucene的XML接口:SAX方式的数据导入和DOM方式的结果输出。

XML的数据源定义:
只要是能够映射成表=》记录=》字段这样层次结构的都可以。因此WebLucene索引的设计比较灵活,甚至可以直接用来索引RSS。

XML结果定义:参考了Google的XML接口的设计

如果没有SERVLET界面,提供XML输出的DOMSearcher也可以很方便集成到各种应用系统中。

参考资料:

系统设计中使用的一些模块:
Jakarta Lucene:
http://jakarta.apache.org/lucene/

Xerces / Xalan
http://xml.apache.org/

Log4j
http://jakarta.apache.org/log4j/

Google的XML接口定义:
http://www.google.com/google.dtd