PHP DOM - 访问新添加的节点

标签 php dom

我使用以下方法将 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/

相关文章:

javascript - 根据 ul ID 将相同的类添加到子元素

php - 如何在高级查询中使用 PDO 制作准备好的语句?

php - 即使用户通过单击“后退”注销后,如何避免进入登录 session ?

javascript - Base64上传图片问题

php - 使用纯 DOM 方法或字符串连接来生成非常动态的 xml 文件哪个更好?

html - CSS- :last-child that has "xyz" class name selector? 纯 CSS/LESS

javascript - 在 OpenLayers 示例中调用 domtoimage.toPng() 时出现 "SecurityError: This operation is insecure"

javascript - 单击带有常规 javascript 的 div

php - Laravel Carbon 本地化不起作用(从数字中获取本地化的月份名称)

php - mysql_query 成功但获取 mysql_fetch_array() 期望参数 1 为资源