XPath和PHP,从查询中选择特定项

时间:2017-12-23 00:48:48

标签: php xpath

我正在尝试遍历HTML文档,特别是一个表,并在每行中选择特定的表格单元格。

所以我从我想要的表中抓取“/ tr”行,但是,我现在对于如何循环遍历行,选择特定的“td”表单元格内容感到困惑?

所以在foreach循环中,我想创建标题并在其下面粘贴特定的单元格,这有意义吗?

这是当前的PHP代码,它最终回显每个tr中所有td的所有内容 - 显然不是我想要的。

$version_list = new DOMDocument;
$version_list->loadHtml($version_html);

$xpath_r = new DOMXPath($version_list);
$versions = $xpath_r->query("//table[contains(@class, 'devices')]/tr");

foreach ($versions as $version)
{
    echo '<strong>Version</strong><br />';
    echo $version->nodeValue . '<br />';
}

示例HTML:

<table class="devices">
  <tr>
    <td>1.0</td>
    <td>Works</td>
  </tr>
  <tr>
    <td>2.0</td>
    <td>Broken</td>
</table>

所以我想在foreach循环内为每一行选择单元格1和单元格2。

所以我想要这样的东西:

echo '<strong>Version</strong><br />';
echo $version->nodeValue (first cell) . '<br />';
echo '<strong>Status</strong><br />';
echo $version->nodeValue (second cell) . '<br />';

1 个答案:

答案 0 :(得分:0)

你的意思是你只想抓住版本?

如果是这样,请使用:"//table[contains(@class, 'devices')]/tr/td[1]"

如果没有添加您想要的输出。

更新:

如果您想要一个可以拔除的子项索引,您需要遍历每个子节点或再次运行另一个查询:

<?php
$version_list = new DOMDocument;
$version_list->loadHtml($version_html);

$xpath_r = new DOMXPath($version_list);
$versions = $xpath_r->query("//table[contains(@class, 'devices')]/tr");

foreach ($versions as $version) {
    $children = $xpath_r->query('*', $version);
    echo '<strong>Version</strong><br />';
    echo $children->item(0)->nodeValue. '<br />';
    echo '<strong>Status</strong><br />';
    echo $children->item(1)->nodeValue. '<br />';
}

https://3v4l.org/9WmnW

getElementsByTagName()

<?php
$version_list = new DOMDocument;
$version_list->loadHtml('<table class="devices">
  <tr>
    <td>1.0</td>
    <td>Works</td>
  </tr>
  <tr>
    <td>2.0</td>
    <td>Broken</td>
</table>');

$xpath_r = new DOMXPath($version_list);
$versions = $xpath_r->query("//table[contains(@class, 'devices')]/tr");

foreach ($versions as $version) {
    $children = $version->getElementsByTagName('td');
    echo '<strong>Version</strong><br />';
    echo $children->item(0)->nodeValue. '<br />';
    echo '<strong>Status</strong><br />';
    echo $children->item(1)->nodeValue. '<br />';
}

https://3v4l.org/0FF1n