xpath循环到未知数量的节点

mat*_*mat 0 php xpath html-parsing

我有一个看起来像这样的xpath:

$path = '//*[@id="page-content"]/table/tbody/tr[3]/td['.$i.']/div/a';
Run Code Online (Sandbox Code Playgroud)

其中,$i从1到X.我会正常使用:

for($i=1; $i<X;$i++){
  $path = '//*[@id="page-content"]/table/tbody/tr[3]/td['.$i.']/div/a';
  $nodelist = $xpath->query($path);
  $result = $nodelist->item(0)->nodeValue;
};
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,我不知道X有多少.有没有办法在不知道X的情况下循环这个?

hak*_*kre 5

为什么不叠加em?像(脆弱的代码,添加你的支票):

// first xpath for the outer node-list
$tds = $xpath->query('//*[@id="page-content"]/table/tbody/tr[3]/td');
foreach ($tds as $td)
{
    // fetch the included values with a relative xpath to the current node
    $nodelist = $xpath->query('./div/a', $td);
    ...
}
Run Code Online (Sandbox Code Playgroud)

实际上你甚至不需要那个内部节点列表,因为你想在最后查询节点值.但是我在这里留下这个来展示你可以通过使用相对于具体节点的xpath直接做什么.


所以,如果你需要的第一个 <a>内部元件的任何 <div>内部第三 <tr>任何内部表任何 id为节点"页面的内容",你可以把它写这样直接,它是一个查询:

//*[@id="page-content"]/table/tbody/tr[3]/td/div/a[1]
Run Code Online (Sandbox Code Playgroud)

谓词(即是括号)仅在它的前缀的路径的节点上,所以[1]只对a在端部因为是[3]只为tr.

代码示例:

$as = $xpath->query('//*[@id="page-content"]/table/tbody/tr[3]/td/div/a[1]');
foreach ($as as $a) 
{
    echo $a->nodeValue, "\n";
}
Run Code Online (Sandbox Code Playgroud)

因此,这将为您提供单个节点列表的结果,您不需要运行第二个xpath查询.