オクラホマなので、先ほどの夜、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から値、属性、要素名をコピーしますが、ターゲット要素の実際の要素名を変更することはできません。
反射がある可能性もありますが、これを行う簡単な方法が必要です。
誰か?
あなたの提案は非常にうまくいった。しかし、私は 'appendChild'と 'cloneNode'と組み合わせて 'importNode'を使用しなければなりませんでした。美しく動作します! 乾杯! –
importNodeを使用している場合は、それを複製する必要はありません。importNodeは、必要に応じて、ノードを複製する必要があります。 – AnthonyWJones