2

次のようなテーブルを取得しました: http://pastebin.com/jjZxeNHF

PHP-DOMDocumentとして取得しました。

ここで、このテーブルを「解析」したいと思います。

私が正しければ、 $superTable->getElementsByTagName('tr')外側の tr だけでなく内側のものも取得するため、次のようなものは機能しません。

foreach ($superTable->getElementsByTagName('tr') as $superRow) {
    foreach ($superRow->getElementsByTagName('td') as $superCol) {
        foreach ($superCol->getElementsByTagName('table') as $table) {
            foreach ($table->getElementsByTagName('tr') as $row) {
                foreach ($row->getElementsByTagName('td') as $col) {
                }
            }
        }
    }
}

2 番目のスニペットで説明されているように、フィールドごとにすべてのテーブルを調べるにはどうすればよいでしょうか。

4

2 に答える 2

1

XPathを使用して、露骨に低レベルの反復の多くを排除し、これらすべての見かけの複雑さを軽減することができます...

$xpath = new DOMXPath($document);
foreach ($xpath->query('//selector/for/superTable//table') as $table) {
    // in case you really wanted them...
    $superCol = $table->parentNode;
    $superRow = $superCol->parentNode;

    foreach ($table->getElementsByTagName('td') as $col) {
        $row = $td->parentNode;
        // do your thing with each cell here
    }
}

必要に応じて、これよりもさらにドリルダウンできます。内部テーブルのすべてのセルが必要な場合は、ループを1つに減らすことができます//selector/for/superTable//table//td

もちろん、有効なHTMLを扱っている場合は、各要素の子をループすることもできます。それはすべて、HTMLがどのように見えるか、そして正確にHTMLから何が必要かによって異なります。

編集:何らかの理由でXPathを使用できない場合は、次のようなことができます。

// I assume you've found $superTable already
foreach ($superTable->getElementsByTagName('table') as $table) {
    $superCol = $table->parentNode;
    $superRow = $superCol->parentNode;
    foreach ($table->getElementsByTagName('td') as $col) {
        $row = $col->parentNode;
        // do your thing here
    }
}

どちらのソリューションも、行などを反復処理する必要がないことに注意してください。これは、現在のテーブルの行のみを取得する必要がないことの大きな部分です。テーブル内のテーブルのみを探しています。これは、定義上、(1)サブテーブルになり、(2)メインテーブル内の行内の列内にあり、親の行と列を次の場所から取得できます。テーブル要素自体。

もちろん、どちらのソリューションも、テーブルを1レベルだけネストしていることを前提としています。それ以上の場合は、再帰的なソリューションとDOMElementのchildNodesプロパティを確認する必要があります。または、より狭く焦点を絞ったXPathクエリ。

于 2012-09-24T16:54:52.967 に答える
1

これが私の解決策です:

foreach ($raumplan->getElementsByTagName('tr') as $superRow) {
    if ($superRow->getElementsByTagName('table')->length > 0) {
        foreach ($superRow->getElementsByTagName('td') as $superCol) {
            if ($superCol->getElementsByTagName('table')->length > 0) {
                foreach ($superCol->getElementsByTagName('table') as $table) {
                    foreach ($table->getElementsByTagName('tr') as $row) {
                        foreach ($row->getElementsByTagName('td') as $col) {
                        }
                    }
                }
            }
        }
    }
}

要素に含まれるテーブルがあるかどうかを調べて、外側のテーブルにいるかどうかを確認します。

于 2012-09-24T18:39:30.027 に答える