我正在编写一个工具,将HTML表格转换为CSV,我注意到一些奇怪的行为.根据这个代码,
$html = <<<HTML
<table>
<tr><td>A</td><td>Rose</td></tr>
</table>
<h1>Leave me behind</h1>
<table>
<tr><td>By</td><td>Any</td></tr>
</table>
<table>
<tr><td>Other</td><td>Name</td></tr>
</table>
HTML;
$dom = new \DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
foreach ($dom->getElementsByTagName('table') as $table) {
foreach ($table->getElementsByTagName('tr') as $row) {
echo trim($row->nodeValue) . PHP_EOL;
}
}
我希望输出如下:
ARose
ByAny
OtherName
但我得到的是:
ARose
ByAny
OtherName
ByAny
OtherName
如果我省略第一个结束标记,我会得到相同的结果.看起来DOMDocument将第二个和第三个<table>
嵌套在第一个中.
事实上,如果我使用xpath只从每个表中获取直接子项,我会得到正确的输出:
$xpath = new \DOMXPath($dom);
foreach ($dom->getElementsByTagName('table') as $table) {
foreach ($xpath->query('./tr', $table) as $row) {
echo trim($row->nodeValue) . PHP_EOL;
}
}