2011-01-19 94 views
4

我只是從SimpleXML的元素與刪除項目刪除項目:PHP的SimpleXML:與

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

,但我不能與一個用於:

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

一些項目被刪除從$ items(Netbeans Debug可以確認),但是當我再次獲得路徑(/ 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進行這種操作的原因。 – 2011-01-19 08:51:33

2

您目前只能是,如你所知,從解封數組的項目。

要獲得神奇解封對的SimpleXMLElement工作,你必須要麼做作爲Xavier Barbosa建議給PHP一點輕推入發射了正確的解封行爲。

以下代碼段中的唯一更改是[0]的新增內容。重點關注這個詞神奇的

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

這樣說的話,我會建議(如Xavier和Josh)進入DOM-land來操作文檔。

0

好吧,我正在絞盡腦汁想弄清楚如何從XML文檔中刪除最後一個孩子。然後我在頂部插入一個新元素。這樣,我的rss feed中總是有一定數量的項目。我無法使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')或者死(「Error」); – jaybyrd 2015-08-07 12:31:18