XPATH 执行复杂查询 [英] XPATH executing complex queries

查看:30
本文介绍了XPATH 执行复杂查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何对给定的 xml 执行以下查询:

How can I execute following queries on the given xml:

  1. if(task1=cde && task2=abc) 我会得到 id=XYZ-987
  2. if((task1=abc && task2=efg) || task5=nop) 我会得到 id=ABC-123,XYZ-987,RST-567

此处为 XML:

<node1>
<node2>
    <node3>
        <id>ABC-123</id>
        <condition>
            <task name="task1" operation="and" value="abc" />
            <task name="task2" operation="and" value="efg" />
            <task name="task3" operation="and" value="hij" />
            <task name="task4" operation="or" value="klm" />
            <task name="task5" operation="and" value="nop" />
            <task name="task6" value="uvw" />
        </condition>
    </node3>
    <node3>
        <id>XYZ-987</id>
        <condition>
            <task name="task1" operation="and" value="cde" />
            <task name="task2" operation="and" value="abc" />
            <task name="task5" operation="and" value="nop" />
        </condition>
    </node3>
    <node3>
        <id>RST-567</id>
        <condition>
            <task name="task1" operation="and" value="abc" />
            <task name="task2" operation="and" value="efg" />
            <task name="task8" operation="and" value="jkl" />
            <task name="task9" operation="and" value="rst" />
            <task name="task10" value="xyz" />
        </condition>
    </node3>
    <node3>
        <id>PQR-345</id>
        <condition>
            <task name="task1" operation="and" value="ijk" />
            <task name="task2" operation="and" value="klm" />
            <task name="task8" operation="and" value="jkl" />
            <task name="task9" operation="and" value="rst" />
        </condition>
    </node3>
</node2>
</node1>    

我尝试了以下规则,但结果为空

I tried the following rule but I get empty result

String expression = "/node1/node2/node3/id[following-sibling::condition/task[(@name='task1' and @value='cde') and (@name='task2' and @value='abc')]]"

我得到了上面的表达式如何使用 XPATH 解析 XML

以上两种情况的表达式是什么?

What would be the expression for above 2 cases?

推荐答案

你的 xpath 不工作的原因是因为你的谓词 [(@name='task1' and @value='cde') 和(@name='task2' and @value='abc')] 在同一个任务节点上执行,如果 @name='task1' 那么@name 永远不能 = 'task2'.

The reason why your xpath doesn't work is because your predicate [(@name='task1' and @value='cde') and (@name='task2' and @value='abc')] executes on the same task node, and if @name='task1' then @name can never be = 'task2'.

相反,您应该创建对所有相关节点进行操作/检查的谓词,如下所示:

Instead you should create predicates that will operate on/check all the relevant nodes like this:

if(task1=cde && task2=abc) 我会得到 id=XYZ-987

if(task1=cde && task2=abc) I would get id=XYZ-987

/node1/node2/node3[condition/task[@name='task1' and @value='cde'] 和 condition/task[@name='task2' and @value='abc']]/id

if((task1=abc && task2=efg) || task5=nop) 我会得到 id=ABC-123,XYZ-987,RST-567

if((task1=abc && task2=efg) || task5=nop) I would get id=ABC-123,XYZ-987,RST-567

/node1/node2/node3[condition/task[@name='task1' and @value='abc'] 和 condition/task[@name='task2' and @value='efg']或条件/任务[@name='task5' and @value='nop']]/id

如果需要,您可以包含括号,但在布尔运算中,参数总是在参数之前计算,因此在这种情况下它们是不必要的:/node1/node2/node3[(condition/task[@name='task1' and @value='abc'] and condition/task[@name='task2' and @value='efg']) 或条件/任务[@name='task5' and @value='nop']]/id

you can include your brackets if you want, but in boolean operations, and arguments are always evaluated before or arguments, so they are unnecessary in this case: /node1/node2/node3[(condition/task[@name='task1' and @value='abc'] and condition/task[@name='task2' and @value='efg']) or condition/task[@name='task5' and @value='nop']]/id

这篇关于XPATH 执行复杂查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆