繁体   English   中英

PHP DOM - 访问新添加的节点

[英]PHP DOM - accessing newly added nodes

我使用以下内容将一个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 Core的东西,我也不会感到惊讶。 通过我isId规范的isId ,我认为它应该已经自动获取了id类型定义。 (我自己的DOM实现肯定会。)但是在这种情况下你的代码会起作用。 我想appendXML毕竟是一个非标准的方法,所以有什么可说的它必须解决像类型定义loadXMLloadHTML会。

所以,也许解决方法是更好的计划。 您可以使用DOMXPath@id属性选择元素,而不是实际ID。 当然这比getElementById慢得多,但希望比normalizeDocument更快。

或者只是丢失XML字符串,并坚持使用DOM方法,如果可以的话; 那么保持对创建元素的引用是微不足道的。 (如果您发现DOM方法对于您正在创建的内容量太过冗长,则可以使用辅助函数来更快地创建元素。)

我所知道的唯一可以解决的问题就是......美妙的是蟒蛇的美丽汤。 DOM全部拆分成一个解析树,您可以随意添加或删除它,您可以编写一个python脚本来处理html,然后通过数据库或系统调用来协调脚本。 或者服务器端javascript可能值得调查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM