大约一年前,我编写了一个受 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
哈普斯!!!