我有一个DOM结构,它可以作为构建更大文档的模板。模板看起来像这样(过于简化的例子)
<book> // $cache[0]
<data></data>
<author></author> // $cache[1]
<published>
<company></company> // $cache[3]
<date></date>
</published>
<blurb></blurb>
<related></related> // $cache[2]
</book>
正如您所希望的那样,我在此模板中缓存某些节点,希望只进行一次昂贵的搜索。 (由于模板的严格标准,XPath在这种情况下无法使用。)
以上模板将添加到如下文档:
<store>
<genre>
<computing>
// Insert here
</computing>
<nature>
// Again here
</nature>
</genre>
</store>
基本上,它可以插入任何地方。我无法弄清楚如何解决的问题是在使用appendChild
和insertBefore
等方法插入模板后如何保持或快速更新缓存点。我能看到的唯一解决方案是重新搜索插入的节点,但是就像我提到的那样,这很昂贵,并且某些帮助第一次搜索的标签将被删除。
我发现插入点类似于任何模板引擎,通过迭代dom并对某些处理程序执行操作,例如。 {{book}}
将请求插入上述模板。
缓存只是DomNode
的数组,但如果有更好的跨文档方法,则可以轻松更改。我愿意接受已实现类似代码的建议或指示。
答案 0 :(得分:0)
我通过不缓存DomNode
而是缓存节点的路径来解决这个问题。我首先查看getNodePath()
向节点返回XPath
,但只看到返回的路径,我看到XPath
必须在引擎盖下进行大量分支。所以我想出了这个:
foreach ( $node->childNodes as $child ) {
$index++;
$path = $path . "->childNodes->item($index)";
}
然后在将节点插入第二个文档后,可以通过
快速引用这些缓存点eval("\$node = \$node$path;");