2011-01-19 14 views
4

のために項目を削除し、私はちょうどでのSimpleXML要素から項目を削除することができます。PHPのSimpleXML:

unset($this->simpleXML->channel->item[0]); 

が、私はAですることはできません。いくつかの項目が削除され

$items = $this->simpleXML->xpath('/rss/channel/item'); 
    for($i = count($items); $i > $itemsNumber; $i--) { 
     unset($items[$i - 1]); 
    } 

$アイテムから(Netbeansデバッグはそれを確認することができます)、パスを再度取得すると(/ rss/channel/item)何も削除されませんでした。

どういうところが間違っていますか?

答えて

6

SimpleXMLはノードの削除を処理しませんので、DOMNodeを使用する必要があります。 DOMNodeにノードをインポートすると、インスタンスは同じツリーを指しています。配列から項目を設定解除、あなたが知っているようにあなたは、唯一の現在だ

<?php 

$items = $this->simpleXML->xpath('/rss/channel/item'); 
foreach ($items as $item) { 
    $node = dom_import_simplexml($item); 
    $node->parentNode->removeChild($node); 
} 
+0

SimpleXMLは、問題の最初の言及として削除を処理しますが、ノードの親を保持していないと、それほど実用的ではないので、そのような操作のためにDOMを使用することをお勧めします。 –

2

だから、あなたはそれを行うことができます。 Xavier Barbosaを提案したり正しい未設定の動作をオフ発射にPHPを少しナッジを与えるよう

はのSimpleXMLElement上で動作するように設定解除魔法は、あなたは何をするのどちらか持って取得します。

以下のコードスニペットの唯一の変更は、[0]の追加です。単語の重い強調魔法の。そうは言って(ザビエルとジョシュが持っているように)

$items = $this->simpleXML->xpath('/rss/channel/item'); 
for($i = count($items); $i > $itemsNumber; $i--) { 
    unset($items[$i - 1][0]); 
} 

、私はドキュメントを操作するためのDOM-地への移動をお勧めします。

0

まあ私は、XML文書から最後の子を削除する方法を見つけようとしている私の脳をつかんでいた。次に、新しい要素を上部に挿入します。この方法では、私のRSSフィードには常に一定量のアイテムがあります。私はxpathのものを動作させることができませんでした。それは、私が使用している無料のサーバーだからですが、とにかくです。これは私がやったことです。私のXML文書はRSSフィードなので、項目が始まる前に6つの要素があります。すなわち、タイトル、チャンネルの下の説明。 $ファイル= 'newrss.xml'; //ファイルを取得

$fp = fopen($file, "rb") or die("cannot open file");//open the file 
$str = fread($fp, filesize($file));//read the file 

$xml = new DOMDocument();//new xml DOMDocument 
$xml->formatOutput = true; 
$xml->preserveWhiteSpace = false; 
$xml->loadXML($str) or die("Error");//Load Document 
// get document element 
$root = $xml->documentElement; 
$fnode = $root->firstChild; 
$ori = $fnode->childNodes->item(6);//The 6th item starts the item nodes 
//Get the number of items in my xml. 
$nodeLength = $fnode->getElementsByTagName('item')->length;//count nodes 
$itemNum=$nodeLength+5;//I added 5 so it starts from the first item 
$lNode = $fnode->childNodes->item($itemNum);//Get the last child node 
$fnode->removeChild($lNode);//finally remove that node. 

私はこれはかなりではない知っているが、それは良い作品。このことを理解することは永遠に私には必要でしたので、私はこの質問をたくさん見てから他の人に助けてくれることを願っています。新しい項目をrssリストの先頭に追加することに興味がない場合は、$ ori変数をスキップできます。さらに、$ ori変数を省略すると、$ itemNumを調整して正しい項目を削除する必要があります。

+0

このコードの最後に、XML文書を再度保存しなければならないことを忘れてしまいました。 $ xml-> save( 'newrss.xml')またはdie( "Error"); – jaybyrd