首页 文章

如何在XPath查询的一部分中匹配两个元素中的任何一个

提问于
浏览
1

我使用php DOMXPath来查询锚点并希望匹配两个元素中的任何一个 . 我目前正在使用管道或条件这样做:

//div[@class="wrapper"]//div[@class="target"]/a | //div[@class="wrapper"]//li[@class="target"]/a

这很有效 . 我也试过这个(如here所述):

//div[@class="wrapper"]//*[self::div or self::li][@class="target"]/a

虽然这确实有效,但它似乎效率低下,因为它使用通配符查询每个元素,然后在事后过滤它们 .

为了更简洁,我可以缩短原始查询,以便我的 | 条件仅适用于特定部分,而不是重复整个查询 . 我以为我可以做这样的事情,但它会抛出一个错误 DOMXPath::query(): Invalid expression

//div[@class="wrapper"]//(div|li)[@class="target"]/a

这可能是正确的语法,还是我需要明确说明每个条件的整个路径?

1 回答

  • 1

    //div[@class="wrapper"]//(div|li)[@class="target"]/a 是有效的 XPath 2.0 表达式,但不是 XPath 1.0 . 您的PHP引擎可能会降级为 XPath 1.0 .

    如果您担心第二个XPath //div[@class="wrapper"]//*[self::div or self::li][@class="target"]/a 的性能,请首先进行配置文件并测量它是否在可接受的范围内执行 . 您可能会发现它的性能足够好,或者与第一个示例相同,并且您不必担心差异 .

    您还可以测试和测量性能的替代方法是在谓词测试 divli 元素之前将谓词限制移动到具有等于"target"的class属性的元素:

    //div[@class="wrapper"]//*[@class="target"][self::div or self::li]/a
    

    或者将它们组合在一个谓词中:

    //div[@class="wrapper"]//*[@class="target" and (self::div or self::li)]/a
    

相关问题