好了,所以我有这个整洁的小想法的晚上来创建一个辅助类的DOM文档,模仿,在一定程度上,jQuery的能力操纵HTML或基于XML字符串的DOM。不是CSS选择器,使用XPath的。例如:

$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;
}

现在,这工作。它替换$内容的克隆版本,每一个产生元素。问题是,它增加了他们对儿童的父节点的列表的底部。现在的问题是,我该如何克隆这个元素来替代其他元素,同时仍保留在DOM原来的位置?

我考虑逆向工程我替换节点。基本上,复制了值,属性和$内容元素的名字,但我无法改变目标元素的实际元素名称。

反射可能是一个可能性,但肯定在做这更简单的方法。

任何人

有帮助吗?

解决方案

使用的replaceChild代替的appendChild / removeChild之。

其他提示

查找如果$元件具有nextsibbling之前去除若有做一个的insertBefore该下一个同级否则简单地追加。

public function replace($Content)
{
        foreach($this->results as $Element)
        {
                if ($Element->nextSibling) {
                    $NextSiblingReference = $Element->nextSibling;
                    $Element->parentNode->insertBefore($Content->cloneNode(true),$NextSiblingReference);
                }
                else {
                    $Element->parentNode->appendChild($Content->cloneNode(true));   
                }
                $Element->parentNode->removeChild($Element);
        }

        return $this;
}

完全未经测试虽然。

或者作为AnthonyWJones建议的replaceChild 时,大的魅力我怎么错过那一刻:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top