XPath opimisation:如果节点不是我的类型,请停止查看

时间:2016-06-07 14:48:52

标签: xml xpath

假设我想有效地从xml文档中选择所有field个节点。 该文件可能如下所示:

<pageSet>
    <field>
        <foo></foo>
        <bar></bar>
    </field>
    <subform>
        <field>
            <foo></foo>
        <bar></bar>
        </field>
        <subform>
            <field>
                <foo></foo>
                <bar></bar>
            </field>
            <field/>
        </subform>
    </subform>
</pageSet>

field节点只能包含pageSetsubform类型的祖先。

有没有办法以这样的方式获取所有字段节点?

/(pageSet or subform nodes of unknown depth)/field

我想告诉xpath处理器在找到subformpageSet以外的元素后不再深入查看。因为那些可以有其他非常嵌套的结构,这会减慢xpath评估。

示例:

/pageSet/subform/one_or_more_unknown_nodes/field不可能发生!当xpath处理器找到one_or_more_unknown_nodes时,它不应该更深,因为没有field节点。

1 个答案:

答案 0 :(得分:2)

嗯,首先,你不能告诉XPath处理器在哪里看:它会做出自己的决定。你能做的最好的事情就是给它足够的信息,以便知道它需要在哪里看。

理论上,给出表达式

//field[not(ancestor::*[not(self::pageSet or self::subform)])]

XPath处理器有足够的信息知道它不需要搜索名称不是pageSet或子表单的元素的后代。

但我怀疑你的XPath处理器是否足够智能。

无论如何它甚至可能都不是一个聪明的策略。根据数据的存储方式和可用的索引,评估该查询的最快方法可能是找到所有field元素,然后检查它们的祖先。 (这意味着如果谓词总是如此,正如您所建议的那样,那么您实际上通过提供谓词来减慢查询速度。)

最重要的是,如果不了解特定XPath处理器的内部结构,就无法明智地讨论XPath表达式的性能。