Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过DOMNodes在循环中执行XPath查询时始终获取相同的节点_Php_Xpath - Fatal编程技术网

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

Php 通过DOMNodes在循环中执行XPath查询时始终获取相同的节点,php,xpath,Php,Xpath,我不知道为什么下面的脚本不起作用 循环中返回的$\u节点始终是我的根内容的第一个子节点,而它应该是第一个、第二个,等等。。。为什么? <?php // utility function function saveNodeAsHTML($node) { $dom = new DOMDocument('1.0'); $node = $dom->importNode($node, true); $dom->appendChild($node); re

我不知道为什么下面的脚本不起作用
循环中返回的$\u节点始终是我的根内容的第一个子节点,而它应该是第一个、第二个,等等。。。为什么?

<?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/>';
?>
loadHTML($content);
$xpath=newdomxpath($dom);
//XPath获取所有td.item节点
$query=“//td[contains(concat(“”,@class,”),'item')”;
$nodes=$xpath->query($query);
回显“

循环开始
”; //循环通过td.item节点 foreach($node作为$node){ echo“

正在分析的节点:”.htmlspecialchars(saveNodeAsHTML($node)); //在$node上下文中查找span标记 $\u query=“//span”; $\u nodes=$xpath->query($\u query,$node); $\u节点=$\u节点->项(0); //$\节点始终是循环的第一项!!! echo'
--节点值:'.saveNodeAsHTML($\u节点); } 回音“

循环结束
”; ?>
此脚本将输出:

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
XML内容:cell1cell2
循环启动
正在分析的节点:cell1
--节点值:cell1
正在分析的节点:cell2
--节点值:cell1
环端

根据中的第二条注释,您必须使用相对路径,例如
//span
。否则,您将获得文档中的所有匹配项(在本例中,
项(0)
单元格1

根据中的第二条注释,您必须使用相对路径,例如
//span
。否则,您将获得文档中的所有匹配项(在本例中,
item(0)
cell1
)@user3584460:因为这是答案(我认为),所以将其放在实际答案中会很有帮助,因此此问题可以自动标记为“已回答”。谢谢,这非常有效。@LarsH我没有想到这一点,所以我贴了一个答案。