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

2016-01-29 13:26 47 1 收藏

XPath中如何比较不同类型的对象,XPath中如何比较不同类型的对象

【 tulaoshi.com - ASP.NET 】

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

来源:http://www.tulaoshi.com/n/20160129/1490174.html

延伸阅读
标签: 整形
不同类型的牙齿整形方法 近年来,随着整形医疗技术的日益发展,许多人对于自己的样貌不满意的都会尝试整形,其中选择牙齿整形的也不在少数,那么针对不同类型的牙齿问题,具体是如何整形的呢?下面为大家介绍不同类型的牙齿整形方法,供大家了解。 龅牙 龅牙可分为牙性与骨骼性龅牙,大部分龅牙能通过牙齿矫正的方法进行...
追求备胎如云的女神 白色吊肩的纱质长裙加白色的镂花短外套。几乎每次偶遇,稍带些张扬的内敛吸引了一群男生的目光。这样的女神,你想调侃她一下,却一直担心玩笑开过了;你模仿叔叔故意让妹子买单,妹子不大乐意你就不知道该怎么办了。语言变了,行为没变,女人反而会觉得你很假,很不靠谱,最后连电脑都没得修了。 女神作为我们最受...
头痛怎么办 不同类型头痛的治疗方法 头痛是常见的一种症状,但是我们很多人对它总是忽略的,其实头痛的种类是非常多的,而且危害也非常的大,所以我们一定要根据不同类型的头痛,进行分别治疗。那么具体方法是什么呢?下面就由图老师小编给大家介绍下吧。 目录 1、九招超有效缓解头痛 2、五种植物可缓解头痛困...
肥胖会导致臀部的部位变大,但是有些女性身体和四肢不肥胖也会出现臀部大的情况,这和生活习惯有着很大的关系。因为长期久坐,臀部很容易会出现扁平、下垂还有肥大等症状,这些形态的臀部都会影响到身体整体的美感。臀部大怎么办?试试下面几招美臀操吧,分别针对不同的臀部问题进行塑造,各个击破,使臀部线条变得更完美。 1、...
标签: 皮肤护理
问答 图钉提问: 岁我的皮肤是油性的,没天都会油光满面,容易长青春痘,感觉很难受。尤其是到了冬天,我不知道要怎么办对我的面部皮肤进行保养了?请专家帮帮我?目前一般情况:油光满面,长粉刺和青春痘,毛孔粗大。病史:第一次问题补充:请问专家,平时洗脸要注意什么问题,如果用化妆品洗脸的话,最好要用什么样的? 图老师解答: 您好:...

经验教程

727

收藏

52
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部