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

2016-01-29 13:26 44 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>

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

延伸阅读
追求备胎如云的女神 白色吊肩的纱质长裙加白色的镂花短外套。几乎每次偶遇,稍带些张扬的内敛吸引了一群男生的目光。这样的女神,你想调侃她一下,却一直担心玩笑开过了;你模仿叔叔故意让妹子买单,妹子不大乐意你就不知道该怎么办了。语言变了,行为没变,女人反而会觉得你很假,很不靠谱,最后连电脑都没得修了。 女神作为我们最受追捧...
标签: 电脑入门
Word软件中有很多不同的下划线,你知道它们都代表什么意思吗? 1.红色或绿色波形下划线 当自动检查拼写和语法时,Word用红色波形下划线表示可能的拼写错误,用绿色波形下划线表示可能的语法错误。右键单击红色波形下划线上的文字,Word将给出更正建议。 2.电子邮件标题的红色波形下划线 Word会自动检查电子邮件标题中的姓名,将它与Out...
标签: 坚果
核桃 核桃堪称抗氧化之王,含有精氨酸、油酸、抗氧化物质等对保护心血管,预防冠心病、中风、老年痴呆等大有裨益,有的人喜欢将核桃仁表面的褐色薄皮剥掉,这样会损失一部分营养,所以,吃核桃的时候最好把这层皮不要剥掉。核桃仁一次不要吃得太多,否则会影响消化。 杏仁 常食杏仁的冠心病患者,心绞痛发生的几率要比不食者减少...
头痛怎么办 不同类型头痛的治疗方法 头痛是常见的一种症状,但是我们很多人对它总是忽略的,其实头痛的种类是非常多的,而且危害也非常的大,所以我们一定要根据不同类型的头痛,进行分别治疗。那么具体方法是什么呢?下面就由图老师小编给大家介绍下吧。 目录 1、九招超有效缓解头痛 2、五种植物可缓解头痛困...
肥胖会导致臀部的部位变大,但是有些女性身体和四肢不肥胖也会出现臀部大的情况,这和生活习惯有着很大的关系。因为长期久坐,臀部很容易会出现扁平、下垂还有肥大等症状,这些形态的臀部都会影响到身体整体的美感。臀部大怎么办?试试下面几招美臀操吧,分别针对不同的臀部问题进行塑造,各个击破,使臀部线条变得更完美。 1、...

经验教程

357

收藏

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