我使用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 回答
//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
的性能,请首先进行配置文件并测量它是否在可接受的范围内执行 . 您可能会发现它的性能足够好,或者与第一个示例相同,并且您不必担心差异 .您还可以测试和测量性能的替代方法是在谓词测试
div
或li
元素之前将谓词限制移动到具有等于"target"的class属性的元素:或者将它们组合在一个谓词中: