使用 DOMDocument 在现有 HTML Table 中创建新列
Creating a New Column in Existing HTML Table using DOMDocument
正在尝试使用 DOMDocument 和 DOMXpath
在现有 table 中创建新列
$doc = new DOMDocument();
$doc->loadHTMLFile("example.html");
example.html
中的 table 的结构如下:
<table id="transactions" class="table">
<thead>
<tr>
<th class="image"></th>
<th class="title"><span>Title</span></th>
</tr>
</thead>
<tbody>
<tr id="tbody-tr">
<td class="image">
<img src="http://www.example.com/image.jpg">
</td>
<td class="title">Title
</td>
<td class="date">12/16/2017
</td>
</tr>
<tr id="tbody-tr">
<td class="image">
<img src="http://www.example.com/image.jpg">
</td>
<td class="title">Title
</td>
<td class="date">12/16/2017
</td>
</tr>
</tbody>
</table>
在这种情况下,table 的 xpath 查询将是
$table = $xpath->query('//*[@id="transactions"]');
对于 <tr id="tbody-tr">
元素
$tr = $xpath->query('/*[@id="tbody-tr"]');
并且对于 <td>
行元素 -- /td[1] /td[2] /td[3]
$td = $xpath->query('//*[@id="tbody-tr"]/td[3]');
我正在尝试为 <tr id="tbody-tr">
的所有实例(大约有 50 个,但为了这个问题缩小了)。
我是 DOMDocument 和 HTML 解析操作的新手,我费了好大的劲才弄清楚如何做到这一点。
我假设我要么必须使用我的 xpath->query
循环它,比如
foreach ($ttrows as $row) {
$td = $doc->createElement('td');
$parent = $row->parentNode;
$parent->appendChild($row);
$td->setAttribute('class','example');
}
或使用 DOMDocuments getElementById
或类似的东西。
foreach ($table = $doc->getElementById('tbody-tr') as $table) {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$td->appendChild($table);
$table->insertBefore($td, $table);
}
正如我所说,我是 DOMDocument 的新手,所以这两个示例几乎什么都不做..但我认为我正朝着正确的方向前进(我希望如此)。
我相信 table 的结构非常好,可以在 DOMDocument 中执行类似的操作。有人能解释一下吗,我的试验和错误让我收效甚微。
解决方案:
foreach ($td as $row) {
$td = $doc->createElement('td', 'text to be inserted');
$td->setAttribute('class','example');
$row->parentNode->insertBefore($td, $row);
}
注意上面那个
$td = $xpath->query('//*[@id="tbody-tr"]/td[3]');
是第三个<td>
classdate
.
记住你cant/shouldnt在同一个页面上有多个 ID。
那就用$tr->insertBefore($td, $tr->childNodes->item(3));
这意味着,当前节点在第 3 个 td 之前插入新的 dom 节点。
<?php
foreach ($doc->getElementsByTagName('tr') as $tr) {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$tr->insertBefore($td, $tr->childNodes->item(3));
}
还需要考虑的是添加 thead > th
否则它会破坏 table 的外观。
foreach ($doc->getElementsByTagName('tr') as $tr) {
// insert into thead > th
if ($tr->childNodes->item(0)->nodeName == 'th') {
$th = $doc->createElement('th');
$th->setAttribute('class', 'example');
$th->nodeValue = 'Example';
$tr->insertBefore($th, $tr->childNodes->item(3));
}
// insert into body > td
else {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$tr->insertBefore($td, $tr->childNodes->item(3));
}
}
正在尝试使用 DOMDocument 和 DOMXpath
在现有 table 中创建新列$doc = new DOMDocument();
$doc->loadHTMLFile("example.html");
example.html
中的 table 的结构如下:
<table id="transactions" class="table">
<thead>
<tr>
<th class="image"></th>
<th class="title"><span>Title</span></th>
</tr>
</thead>
<tbody>
<tr id="tbody-tr">
<td class="image">
<img src="http://www.example.com/image.jpg">
</td>
<td class="title">Title
</td>
<td class="date">12/16/2017
</td>
</tr>
<tr id="tbody-tr">
<td class="image">
<img src="http://www.example.com/image.jpg">
</td>
<td class="title">Title
</td>
<td class="date">12/16/2017
</td>
</tr>
</tbody>
</table>
在这种情况下,table 的 xpath 查询将是
$table = $xpath->query('//*[@id="transactions"]');
对于 <tr id="tbody-tr">
元素
$tr = $xpath->query('/*[@id="tbody-tr"]');
并且对于 <td>
行元素 -- /td[1] /td[2] /td[3]
$td = $xpath->query('//*[@id="tbody-tr"]/td[3]');
我正在尝试为 <tr id="tbody-tr">
的所有实例(大约有 50 个,但为了这个问题缩小了)。
我是 DOMDocument 和 HTML 解析操作的新手,我费了好大的劲才弄清楚如何做到这一点。
我假设我要么必须使用我的 xpath->query
循环它,比如
foreach ($ttrows as $row) {
$td = $doc->createElement('td');
$parent = $row->parentNode;
$parent->appendChild($row);
$td->setAttribute('class','example');
}
或使用 DOMDocuments getElementById
或类似的东西。
foreach ($table = $doc->getElementById('tbody-tr') as $table) {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$td->appendChild($table);
$table->insertBefore($td, $table);
}
正如我所说,我是 DOMDocument 的新手,所以这两个示例几乎什么都不做..但我认为我正朝着正确的方向前进(我希望如此)。
我相信 table 的结构非常好,可以在 DOMDocument 中执行类似的操作。有人能解释一下吗,我的试验和错误让我收效甚微。
解决方案:
foreach ($td as $row) {
$td = $doc->createElement('td', 'text to be inserted');
$td->setAttribute('class','example');
$row->parentNode->insertBefore($td, $row);
}
注意上面那个
$td = $xpath->query('//*[@id="tbody-tr"]/td[3]');
是第三个<td>
classdate
.
记住你cant/shouldnt在同一个页面上有多个 ID。
那就用$tr->insertBefore($td, $tr->childNodes->item(3));
这意味着,当前节点在第 3 个 td 之前插入新的 dom 节点。
<?php
foreach ($doc->getElementsByTagName('tr') as $tr) {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$tr->insertBefore($td, $tr->childNodes->item(3));
}
还需要考虑的是添加 thead > th
否则它会破坏 table 的外观。
foreach ($doc->getElementsByTagName('tr') as $tr) {
// insert into thead > th
if ($tr->childNodes->item(0)->nodeName == 'th') {
$th = $doc->createElement('th');
$th->setAttribute('class', 'example');
$th->nodeValue = 'Example';
$tr->insertBefore($th, $tr->childNodes->item(3));
}
// insert into body > td
else {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$tr->insertBefore($td, $tr->childNodes->item(3));
}
}