gpt4 book ai didi

php - 在原始 DOMDocument 被销毁后访问导入的元素

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:05 34 4
gpt4 key购买 nike

我最近一直在弄乱 DOMDocument,我注意到为了将元素从一个文档转移到下一个文档,我必须调用 $DOMDocument->importNode()在目标 DOMDocument 上。

但是,我遇到了奇怪的问题,一旦原始文档被销毁,克隆的元素就会出现异常。


例如,这里有一些可爱的工作代码:

$dom1 = new DOMDocument;
$dom2 = new DOMDocument;

$dom2->loadHTML('<div id="div"><span class="inner"></span></div>');
$div = $dom2->getElementById('div');

$children = $dom1->importNode( $div, true )->childNodes;

echo $children->item(0)->tagName; // Output: "span"

这是一个演示:http://codepad.viper-7.com/pjd9Ty


当我尝试在原始文档超出范围后使用这些元素时出现问题:

global $dom;
$dom = new DOMDocument;

function get_div_children () {

global $dom;

$local_dom = new DOMDocument;
$local_dom->loadHTML('<div id="div"><span class="inner"></span></div>');

$div = $local_dom->getElementById('div');

return $dom->importNode( $div, true )->childNodes;
}

echo get_div_children()->item(0)->tagName;

以上导致以下错误:

PHP Warning: Couldn't fetch DOMElement. Node no longer exists in ...
PHP Notice: Undefined property: DOMElement::$tagName in ...

这是一个演示:http://codepad.viper-7.com/c0kqOA


我的问题有两个:

  1. 即使原始文档被销毁,返回的元素不应该存在吗,因为它们被克隆到当前文档中?

  2. 解决方法。由于各种原因,我必须在原始文档被销毁之后操作这些元素,但在我将它们实际插入到另一个 DOMDocument 的 DOM 中之前。有什么办法可以做到这一点吗?


说明:我知道如果将元素插入到 DOM 中,它会按预期运行。但是,如上所述,我的设置要求在将元素插入 DOM 之前对其进行操作(长话短说)。考虑到这里的第一个示例有效 - 并且在 DOM 之外操作元素是 JavaScript 中的标准过程 - 这不应该在这里也可行吗?

最佳答案

克隆的节点有对$dom 的引用,但$dom 没有。当调用上下文更改时,内部 PHP 垃圾收集器会销毁此类节点。只有一种方法可以创建此引用:$dom->documentElement->appendChild($node)

所以,使用这样的代码(static 关键字将防止垃圾收集器破坏您的变量):

global $dom;
$dom = new DOMDocument;

function get_div_children () {

global $dom;

$local_dom = new DOMDocument;
$local_dom->loadHTML('<div id="div"><span class="inner"></span></div>');

$div = $local_dom->getElementById('div');
static $nodes;
$nodes = $dom->importNode( $div, true )->childNodes;
return $nodes;
}

echo get_div_children()->item(0)->tagName;

关于php - 在原始 DOMDocument 被销毁后访问导入的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695303/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com