【问题标题】:DomXPath: Search inside DomXPath query result?DomXPath:在 DomXPath 查询结果中搜索?
【发布时间】:2014-05-26 07:41:12
【问题描述】:

如何在不再次查询整个文档的情况下查询子元素的 xpath 结果?

我查询我的文档以找到最后一个带有 menu-item 类的 <li>

$doc = new DomDocument();
@$doc->loadHTML( $html );
// $html is invalid (and should be at this point),
// so use @ sign to suppress errors
$xpath = new DomXPath( $doc );
$li = $xpath->query( "(//li[contains(concat(' ', normalize-space(@class), ' '), 'menu-item')])[last()]" )->item( 0 );

上面的工作正常,现在我想查询$li找到以下内容:

$p = $xpath->query( "//p[contains(concat(' ', normalize-space(@class), ' '), 'field-description')]" )->item( 0 );

带有field-description 类的p 标记。这不起作用并返回找到的第一个实例,如果我对其进行修改并使用[last()](无论这是什么),那么它可以工作,但它不一定是这里的最佳解决方案:

$p = $xpath->query( "(//p[contains(concat(' ', normalize-space(@class), ' '), 'field-description')])[last()]" )->item( 0 );

以上行有效,但我想再次查询 $li 内部而不是整个文档。

【问题讨论】:

    标签: php xpath domdocument xpathquery


    【解决方案1】:

    The second argumentquerycontextnode,它将搜索限制在该节点内。但是,如果您使用绝对 xpath,query 仍将返回整个文档的节点。

    php > $dd = new DomDocument();
    php > // deliberately using malformed html.
    php > $dd->loadhtml('<html><head><title>wat</title></head><body><div>Hello, <p>world</p></div><div class="container"><p>I like pie</div></body></html>');
    php > $xp = new DomXPath($dd); 
    php > $container = $xp->query('//div[@class="container"]')->item(0);
    php > var_dump($xp->query('//p'));
    class DOMNodeList#6 (1) {
      public $length =>
      int(2)
    }
    php > var_dump($xp->query('//p', $container));
    class DOMNodeList#4 (1) {
      public $length =>
      int(2)
    }
    php > var_dump($xp->query('p', $container));
    class DOMNodeList#5 (1) {
      public $length =>
      int(1)
    }
    

    您可以使用.//x 之类的模式在上下文节点内递归匹配所有x 元素。 (HT:Alf Eaton)

    【讨论】:

    • 在您的示例中,当p 不是.container 的直系子代时怎么办。例如,在我的 html 中,我的 p 标记位于:div.menu-item-settings,然后位于 p.field-description。我在示例中搜索 $xpath-&gt;query( 'p', $li ); 的结果仍然返回 0 个结果,我如何在不知道 li 中的完整路径的情况下在 $li 中找到 p
    • $xp-&gt;query('.//p', $container)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多