当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > XPath中如何比较不同类型的对象

ASP.NET
关于.NET动态代理的介绍和应用简介
ASP.NET2.0服务器控件之类型转换器
ASP.net做的IP访问限制
Asp.Net2.0权限树中Checkbox的操作
ASP.NET数据库编程之Access连接失败
ASP.NET 2005 Treeview终极解决方案
ASP.NET数据库编程之处理文件访问许可
ASP.NET 2.0中的页面输出缓存
ASP.NET 2.0服务器控件开发之复杂属性
ASP.NET2.0中数据源控件之异步数据访问
將datagrid控件內容輸出到excel文件
ASP.NET技巧:教你制做Web实时进度条
实现基于事件通知的.Net套接字
ASP.NET技巧:同时对多个文件进行大量写操作对性能优化
ASP.NET中根据XML动态创建使用WEB组件
QQ关于.net的精彩对话
ASP.NET技巧:access下的分页方案
为自己的ASP网站系统构建一套标记语言
Visual Studio.Net 内幕(6)
Asp.Net中NHiernate的Session的管理

ASP.NET 中的 XPath中如何比较不同类型的对象


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 107 ::
收藏到网摘: n/a

目前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>