插入另一个文档时更新DomNode指针

时间:2013-10-04 09:06:58

标签: php xml dom domdocument

我有一个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>

基本上,它可以插入任何地方。我无法弄清楚如何解决的问题是在使用appendChildinsertBefore等方法插入模板后如何保持或快速更新缓存点。我能看到的唯一解决方案是重新搜索插入的节点,但是就像我提到的那样,这很昂贵,并且某些帮助第一次搜索的标签将被删除。

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

缓存只是DomNode的数组,但如果有更好的跨文档方法,则可以轻松更改。我愿意接受已实现类似代码的建议或指示。

1 个答案:

答案 0 :(得分:0)

我通过不缓存DomNode而是缓存节点的路径来解决这个问题。我首先查看getNodePath()向节点返回XPath,但只看到返回的路径,我看到XPath必须在引擎盖下进行大量分支。所以我想出了这个:

foreach ( $node->childNodes as $child ) {
    $index++;
    $path = $path . "->childNodes->item($index)";
}

然后在将节点插入第二个文档后,可以通过

快速引用这些缓存点
eval("\$node = \$node$path;");