2011-02-24 33 views
0

我試圖刪除與從XML文件特定ID的用戶,但面臨以下錯誤:錯誤而通過PHP函數從XML移除元素

Argument 1 passed to DOMNode::removeChild() must be an instance of DOMNode, null given in delUser.php

XML文件:

<currentUsers> 
<user id="101" firstName="Klashinkof" p2p="Yes" priority="Low"/>  
<user id="102" firstName="John" p2p="Yes" priority="High"/> 
</currentUsers> 

代碼:

<?php 
    $id=101; //Test 

// SETUP $doc 
$doc = new DomDocument("1.0"); 
$doc->preserveWhiteSpace = FALSE; 
$doc->validateOnParse = true; 
$doc->Load('currUsers.xml'); 

//REMOVE ID 
    $user= $doc->getElementByID($id); 
    $users= $doc->documentElement; 

    if ($oldPerson = $users->removeChild($user)) { 
     // worked 
     echo "DELETED user {$id}"; 
     } else { 
     return "Couldn't remove $id listing"; 
    } 
$doc->save(curr.xml); 
?> 
+0

'的DOMDocument :: getElementById' - >返回一個DOMElement或NULL,如果未找到該元素。所以它看起來像'$ doc-> getElementByID($ id);'不能通過id找到元素。 – 2011-02-24 08:34:22

回答

1

$doc->getElementById($id); 

回報NULL。您沒有附加模式或DTD,因此id屬性不是XML意義上的有效ID屬性。因此,它不能被getElementById發現。另外,ID不能以數字開頭。

要麼使用XPath,例如,

$xp = new DOMXPath($doc); 
$node = $xp->query("//*[@id='$id']")->item(0); 

或更改id屬性xml:id,但隨後你還必須使用有效的身份證件屬性值。

一旦你獲取了節點,刪除它的最簡單方法就是從中獲取parentNode,例如,

$node->parentNode->removeChild($node); 

在進一步的細節Simplify PHP DOM XML parsing - how?

0

getElementByID()取一個字符串作爲參數shown on the manual

所以應該$id="101";

另外,你應該有一個檢查使用removeChild()if(!is_null($user)){...}

@戈登的解決方案是快過,但如果你不瞭解 XPATH(你應該學習),你可以使用這個:

$users = $doc->getElementsByTagName('user'); 
foreach($users as $user){ 
    if($user->hasAttribute('id') && $user->getAttribute('id') == $id){ 
     $user->parentNode->removeChild($user); 
    } 
} 

DEMO HERE

+0

是的。你是對的。謝謝你的時間。 – baltoro 2011-02-24 09:24:54

+0

@baltusaj:其實我並不正確。現在它正在工作(沒有XPATH的另一個解決方案) – Shikiryu 2011-02-24 09:28:51