1

大约一年前,我编写了一个受 jQuery 启发的库,它允许您使用 PHP 的 XPath 和 DOMDocument 操作 DOM。我最近想清理它并将其作为一个开源项目发布。在过去的几天里,我一直在改进并实现更多 PHP 的原生 OO 功能。

无论如何,我想我会添加一个新方法,它允许您将单独的 XML 文档与当前文档合并。这里的问题是这个方法需要 2 个 XPath 表达式。第一个获取要合并到现有文档中的元素。第二个指定这些合并元素的目标路径。

该方法在从两个路径中获取匹配元素时效果很好,但是我在将外部元素导入当前 DOM 时遇到了问题。我不断收到可怕的“错误文档错误”消息。

我以为我知道我在做什么,但我想我错了。如果你看下面的代码,你可以看到我首先迭代当前文档的匹配元素,然后遍历外部文档的匹配元素。

在第二个嵌套循环中,我尝试将每个外部元素合并到当前文档中的目标路径中。

不确定我在这里做错了什么,因为我在附加之前明确将外部节点导入到当前文档中。

public function merge($source, $path_origin, $path_destination)
{
    $Dom = new self;

    if(false == $Dom->loadXml($source))
    {
        throw new DOMException('XML source could not be loaded into the DOM.');
    }

    $XPath = new DOMXPath($Dom);

    foreach($this->path($path_destination, true) as $Destination)
    {
        if(false == in_array($Destination->nodeName, array('#text', '#document')))
        {
            foreach($XPath->query($path_origin) as $Origin)
            {
                if(false == in_array($Destination->nodeName, array('#text', '#document')))
                {
                    $this->importNode($Origin, true);

                    $Destination->appendChild($Origin->cloneNode(true));
                }
            }
        }
    }

    return $this;
}

您可以在以下 Github 存储库中找到完整的库:

http://github.com/wilhelm-murdoch/DomQuery

哈普斯!!!

4

1 回答 1

2

importNode不会“更改”节点,因此它属于另一个文档。它创建一个属于新文档的新节点并返回它。所以你应该得到它的返回值并在 appendChild 中使用它。

$Destination->appendChild($this->importNode($Origin, true));
于 2010-01-06T02:12:37.607 回答