Php 插入到其他文档时更新DomNode指针

Php 插入到其他文档时更新DomNode指针,php,xml,dom,domdocument,Php,Xml,Dom,Domdocument,我有一个DOM结构,它充当构建更大文档的模板。模板看起来像这样(过于简化的示例) /$cache[0] //$cache[1] //$cache[3] //$cache[2] 正如您希望看到的,我在这个模板中缓存某些节点,希望只执行一次昂贵的搜索。(由于模板的严格标准,XPath在这种情况下不可用。) 上述模板将添加到文档中,如下所示: <store> <genre> <computing> // Insert here

我有一个DOM结构,它充当构建更大文档的模板。模板看起来像这样(过于简化的示例)

/$cache[0]
//$cache[1]
//$cache[3]
//$cache[2]
正如您希望看到的,我在这个模板中缓存某些节点,希望只执行一次昂贵的搜索。(由于模板的严格标准,XPath在这种情况下不可用。)

上述模板将添加到文档中,如下所示:

<store>
    <genre>
    <computing>
        // Insert here
    </computing>
    <nature>
        // Again here
    </nature>
    </genre>
</store>

//在此插入
//再来一次
基本上,它可以插入任何地方。我不知道如何解决的问题是,在使用
appendChild
insertBefore
等方法插入模板后,如何保持或快速更新缓存点。我能看到的唯一解决方案是重新搜索插入的节点,但正如我所提到的,这是昂贵的,某些辅助第一次搜索的标记将被删除

我发现插入点类似于任何模板引擎,通过迭代dom并对某些处理程序执行操作,例如,
{{{book}}
将请求插入上述模板


缓存只是一个由
DomNode
s组成的数组,但如果有更好的跨文档方法,则可以很容易地对其进行更改。我乐于接受指向实现了类似功能的代码的建议或指针。

我解决了这个问题,没有缓存
DomNode
,而是缓存到节点的路径。我首先查看了
getNodePath()
,它向节点返回一个
XPath
,但仅查看返回的路径,我就发现
XPath
必须在后台执行大量分支。所以我想到了这个:

foreach ( $node->childNodes as $child ) {
    $index++;
    $path = $path . "->childNodes->item($index)";
}
然后,在将节点插入到第二个文档中之后,这些缓存点可以被

eval("\$node = \$node$path;");

appendChild
&
insertBefore
DOMNode
的引用,如果要存储
DOMNode
的数组,为什么不引用它们的插入点?(更新将是一个简单的importNode&replaceChild)@Wrikken在示例中,
$cache[0]
可以很容易地从这些方法的返回值更新。我遇到问题的是子/孙节点(
$cache[n]
)。他们仍然会引用原始文档中的节点,我不知道如何在不重新搜索的情况下更新它们。
eval("\$node = \$node$path;");