【问题标题】:Search by XPath under a given element在给定元素下按 XPath 搜索
【发布时间】:2013-04-28 04:43:04
【问题描述】:

我知道在 PHP 中对 DOM 执行 XPath 查询的唯一方法是 DOMXPath,它只适用于 DOMDocument

public __construct ( DOMDocument $doc )

相对于DOMElement,是否有类似的搜索机制?

问题是,我需要搜索相对于DOMElement 的任意 XPath(我无法控制)。

我已经尝试过:

$domElement->getNodePath() . '/' . $xPath;

但如果 XPath 包含 | 字符),则此方法不起作用。

【问题讨论】:

  • 我想这是你会喜欢的:querypath.org 这是我用来在 php 中操作 DOM 的唯一方法。它非常整洁;)
  • 我知道 QueryPath,但如果可以仅使用内置 DOM,我想避免使用它。
  • QueryPath使用的是PHP的SimpleXML,所以没关系,继续用吧。
  • 不,不是ok,我知道有外部库可以完成这项工作,我只是想限制依赖的数量!
  • 另外,我需要取回一组DOMElements,它们与我正在处理的文档中的实例相同,而不是苍白的副本。所以我不能混合 DOM 和另一个库,特别是如果它基于 SimpleXML。

标签: php dom xpath


【解决方案1】:

是的,有。该元素也是文档的一部分,因此您使用文档的 xpath 对象,但是当您运行查询时,还有第二个参数,即第一个参数中的查询解析到的上下文节点 到:

// query all child-nodes of $domElement
$result = $xpath->query('./*', $domElement);

已解决的意思是,如果 xpath 是:

  1. relative,相对于那个$domElement context-node。
  2. 绝对,它解析为文档节点(仍然/再次)。

只有 relative 路径适用于这里的上下文,这就是为什么我在它前面加上一个点作为前缀:./*。一个简单的* 也可以,只是不会让它特别可见。

DOMXpath::query()

【讨论】:

  • @Benjamin:没问题,有一些问题,路径应该写成相对的,这就是我把点放在前面的原因。应该为您提供基于上下文的 xpath 查询的良好开端。在 SimpleXML 中,它自动相对于调用 xpath 方法的元素。
  • 应该没问题,我主要使用来自 CSS-selector-to-XPath 库的 XPath 表达式,基本上都是以 descendant-or-self::
  • @hakre 我亲爱的朋友路径应该写成相对 这是我一直在寻找的声明,非常重要!我很困惑为什么当我使用像 //div[@class='some row'] 这样的东西时我总是得到所有元素,现在我知道要在特定的 DOMElement 中搜索你需要指定像 ./div[@class='some row'] 这样的相对路径。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 2018-10-24
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多