2

我有一个看起来像这样的表:http: //pastebin.com/jjZxeNHF

我把它作为一个 PHP-DOMDocument。

现在我想“解析”这张表。

如果我是正确的,那么类似下面的东西是行不通的,因为 $superTable->getElementsByTagName('tr')不仅会得到外部 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) {
                }
            }
        }
    }
}

如第二个片段中所述,我如何逐个字段地浏览所有表。

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
    }
}

如果你愿意,你可以比这更深入——如果你只想要内部表格中的每个单元格,你可以将它减少到一个循环//selector/for/superTable//table//td

当然,如果您正在处理有效的 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)将在主表中的一行内的列内,您可以从中获取父行和列表格元素本身。

当然,这两种解决方案都假设您只嵌套了一层深的表。如果不止于此,您将需要查看递归解决方案和 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 回答