2009-03-12 8 views
0

オクラホマなので、先ほどの夜、DOMDOCUMENTのヘルパークラスを作成して、ある程度、HTMLまたはXMLのDOMを操作するjQueryの機能を模倣しましたベースの文字列。 CSSセレクタの代わりに、XPathが使用されます。たとえば、DOMXPathを使用してノードの位置を維持したままで置換する

$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'); 

すべてが、現時点では素晴らしい働いていると、私は、このプロジェクトは多くの人々に役立つだろうと思うが、私はその機能の一つについている。私は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から値、属性、要素名をコピーしますが、ターゲット要素の実際の要素名を変更することはできません。

反射がある可能性もありますが、これを行う簡単な方法が必要です。

誰か?

答えて

2

使用のreplaceChild。

+0

あなたの提案は非常にうまくいった。しかし、私は 'appendChild'と 'cloneNode'と組み合わせて 'importNode'を使用しなければなりませんでした。美しく動作します! 乾杯! –

+0

importNodeを使用している場合は、それを複製する必要はありません。importNodeは、必要に応じて、ノードを複製する必要があります。 – AnthonyWJones

0

削除する前に$ elementに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を示唆したように、大きな活力は、どのように私はその瞬間を逃さなかった:)代わりのappendChild /のremoveChildの

+0

ええと、私はそれに渦を立てます。どうも! –

関連する問題