好的,所以那天晚上我有了一个巧妙的小想法,为 DOMDOCUMENT 创建一个辅助类,它在某种程度上模仿 jQuery 操作 HTML 或基于 XML 的字符串的 DOM 的能力。使用 XPath 代替 css 选择器。例如:
$Xml->load($source)
->path('//root/items')
->each(function($Context)
{
echo $Context->nodeValue;
});
这将在每个结果节点上调用回调函数。不幸的是,PHP 版本 < 5.3.x 不支持 lambda 函数或闭包,所以我不得不暂时做一些类似这样的事情:
$Xml->load($source)
->path('//root/items')
->walk('printValue', 'param1', 'param2');
目前一切都很好,我认为这个项目对很多人都有用,但我坚持使用其中一个功能。我正在尝试模仿 jQuery 的“替换”方法。使用以下代码,我可以通过应用以下方法轻松完成此操作:
$Xml->load($source)
->path('//root/items')
->replace($Xml->createElement('foo', 'bar')); // can be an object, string or XPath pattern
这个方法背后的代码是:
public function replace($Content)
{
foreach($this->results as $Element)
{
$Element->parentNode->appendChild($Content->cloneNode(true));
$Element->parentNode->removeChild($Element);
}
return $this;
}
现在,这行得通。它将每个结果元素替换为 $Content 的克隆版本。问题在于它将它们添加到父节点的子节点列表的底部。问题是,我如何克隆这个元素来替换其他元素,同时仍然保留 DOM 中的原始位置?
我正在考虑对要替换的节点进行逆向工程。基本上,从 $Content 复制值、属性和元素名称,但我无法更改目标元素的实际元素名称。
反射可能是一种可能性,但必须有一种更简单的方法来做到这一点。
有人吗?