.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
XPath中如何比较不同类型的对象

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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



相关文章

相关软件