【问题标题】:Error while removing an element from XML via PHP functions通过 PHP 函数从 XML 中删除元素时出错
【发布时间】:2011-02-24 08:14:07
【问题描述】:

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

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

【问题讨论】:

  • DOMDocument::getElementById -> 如果未找到元素,则返回 DOMElement 或 NULL。所以看起来 $doc-&gt;getElementByID($id); 无法通过 id 找到元素。

标签: php xml


【解决方案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?

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • @baltusaj :实际上,我错了。现在它正在工作(另一个没有 XPATH 的解决方案)
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多