【问题标题】:XPATH executing complex queriesXPATH 执行复杂查询
【发布时间】:2016-06-07 20:02:54
【问题描述】:

如何在给定的 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>    

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

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

我从上面得到了上面的表达式 How to parse XML using XPATH

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

【问题讨论】:

    标签: android xml xpath xml-parsing


    【解决方案1】:

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

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

    1.

    if(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.

    if((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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多