0

我有一个 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}}将请求插入上述模板。

缓存只是一个DomNodes 数组,但如果有更好的跨文档方法,则可以轻松更改。我对实现类似代码的建议或指针持开放态度。

4

1 回答 1

0

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

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

然后在将节点插入到第二个文档中之后,那些缓存点就可以被

eval("\$node = \$node$path;");
于 2013-10-05T06:02:13.957 回答