北天软件工作室
北天软件集网站建设、网站开发、软件开发、网站优化SEO、网站宣传、网站开发成一体的网络公司。北天软件是专业的网站建设、网站开发、设计、制作和网站国际推广、搜索引擎推广的网络公司。口号:考虑企业所需,实现企业所想。JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!   旧版java技术网 | 设为首页 | 文章搜索 | RSS订阅地图
免费使用JavaCMS自助建站系统
  文章搜索:   
初学者园地  javascript  java技术  .Net技术 XML/WebService  数据库技术  web2.0技术  设计模式  设计框架  SEO技术  综合知识
您现在的位置是: 北天软件门户网>>.Net技术>>详细信息
XPath中如何比较不同类型的对象
目前XPath2.0还没有正式定稿,因此本文的讨论是基于XPath1.0.
XPath支持四种基本类型:
1. Node-set
2. string
3. number
4. boolean
我们知道一个Location Step由Axis,Node Test和Predicate三部分组成,而用于查询XML文档的XPath又是由若干Location Step组成,比如/table/row[id=''''''''0000'''''''']。在Predicate中几乎总是需要运用=,!=,<,<=,<=进行比较。而对于不同的对象如何进行比较,尤其是涉及到node-set的比较却是十分容易使人困惑。比如对下面文档进行Root/Numbers[Integer/@value > 4]<Root>查询。
<Numbers>
<Integer value="4" />
<Integer value="2" />
<Integer value="3" />
</Numbers>
<Numbers>
<Integer value="2" />
<Integer value="3" />
<Integer value="6" />
</Numbers>
</Root>

下面我以伪代码的形式解释XPath中是如何比较不同对象的。其中compareObjects涉及到

boolean compareObjects(Object operand1,Object operand2,String operator)throws Exception{

//both objects to be compared are node-sets

if(both operand1 and operand2 are node-sets){

Iterator i1 = operand1.iterator();

Iterator i2 = operand2.iterator();

while((node1 =i1.next()!=null){

while((node2 =i2.next()!=null){

//convert node1 and node2 to string values

String s1 = (String)node1;

String s2 = (String)node2;

if(compareBasic(s1,s2,operator))return true;

}

}

//neither object to be compared is a node-set

}else if(neither operand1 nor operand2 is node-set){

return compareBasic(operand1,operand2,operator);

}else{

//In this case, one object is node-set and the other is of basic type.Assume operand1 is node-set

Iterator i1 = operand1.iterator();

while((node1 =i1.next()!=null){

if(operand2 is number)convert node1 to number as a new object named newOperand1

if(operand2 is string)convert node1 to string as a new object named newOperand1

if(operand2 is boolean)convert node1 to boolean as a new object named newOperand1

if(compareBasic(newOperand1,operand2,operator))return true

}

}

return false

}

boolean compareBasic(Object operand1, Object operand2, String operator) throws Exception{

if (operator is "<=" or "<" or ">=" or ">"){

convert operand1 and operand2 to number

compare the two numbers with the operator;

}else if("=".equals(operator)||"!=".equals(operator)){

if(at least one object is boolean){convert the other object to boolean}

if(at least one object is number){convert the other object to number}

if(at least one object is string){convert the other object to string}

compare the new two objects with "=" or "!="

}else{

throw new Exception("Doesn’t support this operator!");

}

}


根据上述算法,该查询就是选择文档中的所有 <Numbers> 元素,其中“至少一个”<Integer> 元素具有值大于 4 减 1 的 value 属性。查询结果应该是:
<Numbers>
<Integer value="4" />
<Integer value="2" />
<Integer value="3" />
</Numbers>
<Numbers>
<Integer value="2" />
<Integer value="3" />
<Integer value="6" />
</Numbers>
关闭窗口 】   【 返回首页
推荐文章
· 通过ASP.net程序创建...
· ASP.NET调用oracle存...
· 多媒体:ASP.NET教程之...
· 多媒体:ASP.NET教程之...
· 多媒体:ASP.NET教程之...
· 多媒体:ASP.NET教程之...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· 利用.NET的File控件...
· ASP.NET中Session的...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· 多媒体:ASP.NET教程...
· Asp.NET的DataGrid排...
· 多媒体:ASP.NET教程之...
· 多媒体:ASP.NET教程之...
北天软件工作室 粤ICP备06079815号 版权所有©2006-2008
精彩出品 JavaCMS自助建站 (C)2006-2008 www.it3838.com limited.all rights reserved.
Powered by JavaCMS V2.6.0