我有一张看起来像这样的表: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) {
}
}
}
}
}
我如何逐字段地遍历所有表格,如第二个片段中所述。
答案 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) {
}
}
}
}
}
}
}
通过查看元素中是否包含表来检查您是否在外表中。