0

9 つのテーブル行がありますが、DOMXpath を使用して最上位ノードにクエリを実行すると、3 つしか返されません。

<table class="something">
    <tbody>
        <tr>
            <td class="label">One</td>
            <td>111111</td>
        </tr>
        <tr>
            <td class="label">Two</td>
            <td>1454</td>
        </tr>    
        <tr>
            <td class="label">Three</td>
            <td></td>
        </tr>
        <tr>
            <td class="label">Four</td>
            <td>0</td>
        </tr>
        <tr>
            <td class="label">Five</td>
            <td>45</td>
        </tr>
        <tr>
            <td class="label">Six</td>
            <td>45</td>
        </tr>
        <tr>
            <td class="label">Seven</td>
            <td>5</td>
        </tr>
        <tr>
            <td class="label">Eight</td>
            <td>0</td>
        </tr>
        <tr>
            <td class="label">Nine</td>
            <td>0</td>
        </tr>
    </tbody>
</table>

DOMDocument を使用して HTML を読み込みます。

$doc = new DOMDocument;
@$doc->loadHTML($htmlData);
$xpath = new DOMXpath($doc);
$tableRows = $xpath->query('//table[@class="something"]//tr');

残念ながら、テーブル行の完全なセットは返されず、最初の 3 行のみが返されます。<td></td>空の要素が何らかの形で xpath パーサーから外れていると思います。これに対する解決策はありますか?

編集:

DOMXpath を使用せずに別のアプローチを試みています。

    $request = drupal_http_request($url);

    $data = $request->data;

    $doc = new DOMDocument;
    @$doc->loadHTML($data);
    $tables = $doc->getElementsByTagName('table');
    $rows = $tables->item(2)->getElementsByTagName('tr');
    $output = '';
    foreach($rows as $row) {
        $cols = $row->getElementsByTagName('td');
        foreach($cols as $col){
            $output .= $col->nodeValue . '<br/>';
        }
    }
    return $output;

どちらの方法でも、次の HTML が出力されます。

<div class="content">
    One<br>111111<br>Two<br>1454<br>Three<br><br>
</div>

最初の例では、$tableRows->length は 3 で、出力と一致していますが、9 行のマークアップとは一致していません。

4

1 に答える 1