doushangxianq07480 2015-06-17 20:31
浏览 75
已采纳

在通过DOMNodes循环中执行XPath查询时始终获取相同的节点

I don't know why the following script doesn't work !
The $_node returned within the loop is always the first child node of my root content, whereas it should be the first, the second, etc... WHY ?

<?php
// utility function
function saveNodeAsHTML($node)
{
    $dom  = new DOMDocument('1.0');
    $node = $dom->importNode($node, true);
    $dom->appendChild($node);
    return $dom->saveHTML();
}

//  root content
$content = '<table><tbody><tr><td class="item"><span>cell1</span></td><td class="item"><span>cell2</span></td></tr></tbody></table>';
echo 'XML content : ' . htmlspecialchars($content);
$dom                     = new DOMDocument();
$dom->loadHTML( $content );
$xpath = new DOMXPath( $dom );
// XPath to get all td.item nodes
$query = "//td[contains(concat(' ', @class, ' '), ' item ')]";
$nodes = $xpath->query( $query );
echo '<br/><br/>LOOP START<br/>';
// looping through td.item nodes
foreach ( $nodes as $node ) {
    echo '<br/><br/>node being parsed : ' . htmlspecialchars(saveNodeAsHTML($node));
    // looking for the span tag inside the $node context
    $_query = "//span";
    $_nodes = $xpath->query( $_query, $node );
    $_node  = $_nodes->item( 0 );
    // $_node is alwayd the first item of the loop !!!
    echo '<br/>--node value : ' . saveNodeAsHTML($_node);
}
echo '<br/><br/>LOOP END<br/>';
?>

This script will output :

XML content : <table><tbody><tr><td class="item"><span>cell1</span></td><td class="item"><span>cell2</span></td></tr></tbody></table>

LOOP START

node being parsed : <td class="item"><span>cell1</span></td> 
--node value : cell1 

node being parsed : <td class="item"><span>cell2</span></td> 
--node value : cell1

LOOP END
  • 写回答

1条回答 默认 最新

  • dongwuying0221 2015-06-18 07:20
    关注

    As per the second comment in http://php.net/manual/en/domxpath.query.php, you have to use relative path, e.g. .//span. Otherwise, you will get all matches in the document (and item(0) is cell1 in this case).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)