DOMElement 似乎没有从 DOMNodeList 中删除
DOMElement does not seem to be removed from DOMNodeList
请帮忙!
需要 删除 来自 DOMNodeList $myDivs
的第一个元素,但实际删除不会发生 - 元素仍然存在。
$dom = new DOMDocument();
$dom->loadHTML($file);
$xpath = new DOMXPath($dom);
$myDivs = $xpath->query('//div[@data-name|data-price]');
usleep(1);
//Must REVERSE iterate DOMNodeList.
for ($i = $myDivs->length - 1; $i >= 0; $i--) {
//Deleting 1st element of (DOMNodeList) $myDivs, containing advertisement product
if ($i == 0) {
//Removing div element (DOMNode) from DOM? DOMNodeList? Nothing changes
$result = $myDivs->item($i)->parentNode->removeChild($myDivs->item($i));
}
//Adding formatted string of attributes of valid DOMElements (div)
$outputArr[] = printf('%1$s - %2$s, %3$s.<br>',
$myDivs->item($i)->getAttribute('data-name'),
$myDivs->item($i)->getAttribute('data-price'),
$myDivs->item($i)->getAttribute('data-currency'))
?? null;
}
for(){}
反向遍历 $myDivs
,由 XPath 获取并在最后一次迭代($i=0
,元素 #0)DOM 应清除所有元素(DOM 和 DOMNodeList),从 php.net 看来:
You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards
但这并没有发生!
没有错误发生,$result
等于确切的元素 #0(意味着 removeChild()
已正确完成它的工作)
调试时,我在第 usleep(1);
行得到 $myDivs->length=31
,在第 $outputArr[] =...
行,我仍然有相同长度的 $myDivs
。
所以,元素 #0 仍然附加到 $ouputArr
,而不应该...
看不到我错过了什么...
P.S。当然,这种情况是不是总可以直接用continue
来迭代跳转,但是删除呢?
您没有引用官方文档,而是用户提供的评论。从 XPath 查询返回的 DOMNodeLists 不是 "live"。 removeChild
仅从原始文档中删除节点,而不是从 DOMNodeList 中删除节点。
请帮忙!
需要 删除 来自 DOMNodeList $myDivs
的第一个元素,但实际删除不会发生 - 元素仍然存在。
$dom = new DOMDocument();
$dom->loadHTML($file);
$xpath = new DOMXPath($dom);
$myDivs = $xpath->query('//div[@data-name|data-price]');
usleep(1);
//Must REVERSE iterate DOMNodeList.
for ($i = $myDivs->length - 1; $i >= 0; $i--) {
//Deleting 1st element of (DOMNodeList) $myDivs, containing advertisement product
if ($i == 0) {
//Removing div element (DOMNode) from DOM? DOMNodeList? Nothing changes
$result = $myDivs->item($i)->parentNode->removeChild($myDivs->item($i));
}
//Adding formatted string of attributes of valid DOMElements (div)
$outputArr[] = printf('%1$s - %2$s, %3$s.<br>',
$myDivs->item($i)->getAttribute('data-name'),
$myDivs->item($i)->getAttribute('data-price'),
$myDivs->item($i)->getAttribute('data-currency'))
?? null;
}
for(){}
反向遍历 $myDivs
,由 XPath 获取并在最后一次迭代($i=0
,元素 #0)DOM 应清除所有元素(DOM 和 DOMNodeList),从 php.net 看来:
You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards
但这并没有发生!
没有错误发生,$result
等于确切的元素 #0(意味着 removeChild()
已正确完成它的工作)
调试时,我在第 usleep(1);
行得到 $myDivs->length=31
,在第 $outputArr[] =...
行,我仍然有相同长度的 $myDivs
。
所以,元素 #0 仍然附加到 $ouputArr
,而不应该...
看不到我错过了什么...
P.S。当然,这种情况是不是总可以直接用continue
来迭代跳转,但是删除呢?
您没有引用官方文档,而是用户提供的评论。从 XPath 查询返回的 DOMNodeLists 不是 "live"。 removeChild
仅从原始文档中删除节点,而不是从 DOMNodeList 中删除节点。