我正在尝试从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);
?>
答案 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);
中的详细信息
答案 1 :(得分:0)
getElementByID()
将字符串作为参数shown on the manual。
所以它应该是 $id="101";
另外,在使用removeChild()
1>之类的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);
}
}