使用XPath和amp;合并两个XML文档时出错DOM文档

时间:2010-01-06 01:41:21

标签: php xml dom xpath domdocument

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

无论如何,我想我会添加一个新方法,允许您将单独的XML文档与当前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

HALPS !!!

1 个答案:

答案 0 :(得分:2)

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

$Destination->appendChild($this->importNode($Origin, true));