gpt4 book ai didi

PHP DOM - 访问新添加的节点

转载 作者:搜寻专家 更新时间:2023-10-31 21:46:49 25 4
gpt4 key购买 nike

我使用以下方法将 html 文档放入 DOM:

$dom = new domDocument('1.0', 'utf-8');
$dom->loadHTML($html)

然后我向 html 中的元素添加一些新内容:

$element = $dom->getElementById('mybox');
$f = $dom->createDocumentFragment();
$f->appendXML('<div id="newbox">foo</div>');
$element->appendChild($f);

但如果我现在想操作#newbox,我就做不到,因为我无法使用getElementById() 访问它。为此,我必须执行以下操作(使用新的 html 重新加载):

$html = $dom->saveHTML();
$dom->loadHTML($html)

这工作正常,但是当必须在每次 dom 操作之间执行此操作时,它会在性能方面变得昂贵。

有没有更好的方法来“刷新”DOM,以便它与新添加的元素一起工作?

提前致谢! :)

最佳答案

关于保存和加载的方法,你也可以尝试 Document.normalizeDocument .这应该修复文档,就好像它已经被保存循环一样,而实际上并没有真正序列化。应该做的一件事是重新计算 isID - 来自文档类型的属性,您希望将其设置为 HTML 文档类型之一(将 id 定义为值类型 ID 的属性) 通过 loadHTML

(还有 Element.setIdAttribute 可用于声明 Attr 的一个实例以包含 ID,但这对您没有用,因为您必须先获取它.)

不过我还没有对此进行测试,如果 PHP 没有正确实现这个 DOM Level 3 核心内容,我也不会感到惊讶。根据我对 the spec for isId 的解释,我认为它应该已经自动获取了 id 类型定义。 (我自己的 DOM 实现当然可以。)但在那种情况下,您的代码会起作用。而且我认为 appendXML 毕竟是一种非标准方法,所以没有什么可说的,它必须解析像 loadXMLloadHTML 这样的类型定义.

因此,也许变通方案是更好的计划。您可以使用 DOMXPath通过 @id 属性而不是真实的 ID 来选择元素。当然这会比 getElementById 慢很多,但希望比 normalizeDocument 快。

或者,如果可以的话,放弃 XML 字符串转换并坚持使用 DOM 方法;那么保留对​​已创建元素的引用就很简单了。 (如果您发现 DOM 方法对于您正在创建的内容量而言过于冗长,则可以使用辅助函数更快地创建元素。)

关于PHP DOM - 访问新添加的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733014/

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