php domdocument解析嵌套表

时间:2012-09-24 16:42:39

标签: php domdocument

我有一张看起来像这样的表: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 个答案:

答案 0 :(得分: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查询。

答案 1 :(得分: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) {
                        }
                    }
                }
            }
        }
    }
}

通过查看元素中是否包含表来检查您是否在外表中。