大约一年前,我写了一个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 !!!
答案 0 :(得分:2)
importNode
不会“更改”节点,因此它属于另一个文档。它创建一个属于新文档的新节点并返回它。所以你应该得到它的返回值并在appendChild中使用 。
$Destination->appendChild($this->importNode($Origin, true));