【问题标题】:XPATH parsing issue with complex data复杂数据的 XPATH 解析问题
【发布时间】:2016-06-18 03:02:59
【问题描述】:

如何获取条件 name="task1", value="abc" AND name="task2", value="efg" name="task5", value="nop" 的 ID

预期输出:ABC-123; XYZ-987
实际输出:XYZ-987
查询:/node1/node2/node3[condition/task[@name='task1' and @value='abc'] and condition/task[@name='task2' and @value='efg'] and condition/task[@name='task5' and @value='nop'] and count(condition/task)=3]/id

查询引用自How to parse and fetch exact result from XML using XPATH

Catch 如果任务中的所有操作(除了满足的任务)都是“或”,那么该 ID 也应该被视为满足条件。在下面的 XML 中,ABC-123、LMN-543 和 XYZ-987 满足条件,但 ABC-123 具有所有其他操作 =“OR”。所以这也应该包含在结果中。通过使用计数,我限制为 3 个任务,因此不包括 ABC-123。使用 count>3 将获取 ABC-123、LMN-543 和 XYZ-9876。

需要输出为 ABC-123; XYZ-987 对操作使用条件检查=或

以下是使用的 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="or" value="hij" />
            <task name="task4" operation="or" value="klm" />
            <task name="task5" operation="or" value="nop" />
            <task name="task6" value="uvw" />
        </condition>
    </node3>
    <node3>
        <id>LMN-543</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="or" value="nop" />
            <task name="task6" value="uvw" />
        </condition>
    </node3>
    <node3>
        <id>XYZ-987</id>
        <condition>
            <task name="task1" operation="and" value="abc" />
            <task name="task2" operation="and" value="efg" />
            <task name="task5" operation="or" 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>

【问题讨论】:

    标签: android xml parsing xpath


    【解决方案1】:

    你必须重新构建你的条件:

    /node1/node2/node3[(condition/task/@name='task1' and condition/task/@value='abc') and (condition/task/@name='task2' and condition/task/@value='efg')  and (condition/task/@name='task5' and condition/task/@value='nop')]/id
    

    在这种情况下,括号 () 是可选的,但它们提高了可读性。 请注意,根据您提供的示例数据,LMN-543 也满足查询。

    返回

    <id>ABC-123</id>
    <id>LMN-543</id>
    <id>XYZ-987</id>
    

    我对你的'catch'条件不是很清楚,但根据你所说的,它可以在每个节点中翻译,最多有2个 operation="and" 任务。 这使得和额外的

    and (count(condition/task[@operation='and']) < 3)
    

    xpath 变成了

    /node1/node2/node3[(condition/task/@name='task1' and condition/task/@value='abc') and (condition/task/@name='task2' and condition/task/@value='efg')  and (condition/task/@name='task5' and condition/task/@value='nop') and (count(condition/task[@operation='and']) < 3)]/id
    

    返回:

    <id>ABC-123</id>
    <id>XYZ-987</id> 
    

    【讨论】:

    • 请再看一遍问题。你提供了我已经在使用的东西。我需要摆脱 LMN-543。有什么解决办法吗?
    • 编辑答案以对操作员添加额外的约束
    【解决方案2】:

    /node1/node2/node3[count(condition/task[not(@name='task1' and @value='abc') and not(@name='task2' and @value='efg') and @operation]) = count(condition/task[@operation='or'])]/id

    将返回所有 id,其中:

    • 具有@operation 属性且与@name='task1' and @value='abc'@name='task2' and @value='efg' 条件不匹配的任务数
    • 等于@operation = 'or' 所在的任务数

    这是ABC-123XYZ-987

    【讨论】:

    • 我必须使用 XPATH 查询两次,然后找到两个结果的交集才能得到我想要的结果。上面是大文件的一小部分,所以有更复杂的情况才能得到正确的输出。
    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多