通过PHP函数从XML中删除元素时出错

时间:2011-02-24 08:14:08

标签: php xml

我正在尝试从xml文件中删除具有特定ID但仍面临以下错误的用户:

  

参数1传递给   DOMNode :: removeChild()必须是   DOMNode的实例,null中给出的null   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); 
?>

2 个答案:

答案 0 :(得分: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,但您还必须使用有效的ID属性值。

获取节点后,删除节点的最简单方法是从中获取parentNode,例如

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

Simplify PHP DOM XML parsing - how?

中的详细信息

答案 1 :(得分:0)

getElementByID()将字符串作为参数shown on the manual

所以它应该是$id="101";

另外,在使用removeChild() 之类的if(!is_null($user)){...}之前,您应该检查

@ Gordon的解决方案更快但如果你不理解 XPATH(你应该学习),你可以使用它:

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

DEMO HERE