0

さて、先日、HTMLまたはXMLベースの文字列のDOMを操作するjQueryの機能をある程度模倣するDOMDOCUMENTのヘルパークラスを作成するというちょっとしたアイデアがありました。cssセレクターの代わりに、XPathが使用されます。例えば:

$Xml->load($source)
    ->path('//root/items')
    ->each(function($Context)
    {
        echo $Context->nodeValue;
    });

これにより、結果のすべてのノードでコールバック関数が呼び出されます。残念ながら、PHPバージョン<5.3.xはラムダ関数またはクロージャをサポートしていないため、当面は次のようなことを行う必要があります。

$Xml->load($source)
    ->path('//root/items')
    ->walk('printValue', 'param1', 'param2');

現在、すべてが順調に進んでおり、このプロジェクトは多くの人に役立つと思いますが、私はその機能の1つにとらわれています。jQueryの「replace」メソッドを模倣しようとしています。次のコードを使用すると、次の方法を適用することでこれを非常に簡単に実行できます。

$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から値、属性、要素名をコピーしますが、ターゲット要素の実際の要素名を変更することはできません。

リフレクションは可能性がありますが、これを行うためのより簡単な方法が必要です。

誰か?

4

2 に答える 2

2

appendChild/removeChild の代わりに replaceChild を使用します。

于 2009-03-12T23:07:33.257 に答える
0

$element が削除する前に次の兄弟を持っているかどうかを調べます。

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を提案したように、どうやってその瞬間を逃したのでしょうか :)

于 2009-03-12T23:01:49.150 に答える