2011-02-24 3 views
0

내가 XML 파일에서 특정 ID를 가진 사용자를 삭제하려고하지만, 다음과 같은 오류에 직면하고있다 :오류 동안

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로 요소를 찾을 수 없습니다. –

답변

1

귀하의

$doc->getElementById($id); 

반환 NULL. 스키마 또는 DTD가 첨부되어 있지 않으므로 id 속성은 XML 의미에서 유효한 ID 속성이 아닙니다. 따라서 getElementById으로 찾을 수 없습니다. 또한 ID는 숫자로 시작할 수 없습니다.

XPath를 사용하십시오.

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

또는 xml:id에 id 속성을 변경할 수 있지만, 당신은 또한 유효한 ID 속성 값을 사용해야합니다.

노드를 가져온 후에 노드를 가져 오는 것이 가장 쉬운 방법은 parentNode을 가져 오는 것입니다 (예 : 에서

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

더 자세한 사항 Simplify PHP DOM XML parsing - how?

0

getElementByID()shown on the manual과 같은 문자열을 매개 변수로 사용합니다. (

그래서 $id="101";

플러스해야합니다, 당신은 if(!is_null($user)){...} 고든의 솔루션은 빠른 @

같은 removeChild()을 사용하기 전에 체크을해야하지만 그렇게하지 않으면 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

+0

@baltusaj : 사실, 나는 옳지 않았습니다. 이제 작동 중입니다 (XPATH가없는 또 다른 솔루션). – Shikiryu

관련 문제