繁体   English   中英

XPATH执行复杂的查询

[英]XPATH executing complex queries

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

  1. 如果(task1 = cde && task2 = abc)我会得到id = XYZ-987
  2. 如果((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>    

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

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

我从如何使用XPATH解析XML中获得了上述表达式

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

您的xpath不起作用的原因是因为您的谓词[(@name='task1' and @value='cde') and (@name='task2' and @value='abc')]在同一位置执行任务节点,如果@name = 'task1'@name永远不会是'task2'

相反,您应该创建谓词,该谓词将在所有相关节点上运行/检查,如下所示:

1。

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

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

2。

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

/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

你可以包括你的括号,如果你想要的,但在布尔运算, and参数总是之前评估or论证,所以他们在这种情况下没有必要: /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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM