如何使用 XPATH 从 XML 中解析和获取准确的结果

Posted

技术标签:

【中文标题】如何使用 XPATH 从 XML 中解析和获取准确的结果【英文标题】:How to parse and fetch exact result from XML using XPATH 【发布时间】:2016-03-03 11:11:51 【问题描述】:

使用以下 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="abc" />
            <task name="task2" operation="and" value="efg" />
            <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>

我想得到条件 name="task1", value="abc" AND name="task2", value="efg" AND name="task5", value="nop" 的 ID=XYZ-987

我得到 2 个结果(ABC-123 和 XYZ-987)而不是 1 个(XYZ-987)。 使用以下 XPATH 表达式

/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']]/id

如何根据输入条件大小过滤这 2 个结果,并获得具有上述 3 个条件的条目?

请参考XPATH executing complex queries 开发表达式。

【问题讨论】:

【参考方案1】:

通过在表达式中附加 " and count(condition/task)=3" 得到答案。

/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

【讨论】:

你的意思是and count(condition/task)=3 吗? 是的,添加计数我得到了结果 我的意思是发布的 XML 中没有 event 元素,但突然你的答案中有 count(condition/event)。这可能会让未来的访问者感到困惑,您是认真的还是错字?

以上是关于如何使用 XPATH 从 XML 中解析和获取准确的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XML::XPath 获取属性?

如何在 Java 中使用 XPath 从 XML 中获取特定节点?

使用 xpath 从格式不正确的页面解析 XML

xpath 语法

Perl,如何解析 XML 文件,xpath

Xpath语法-爬虫