SimpleXMLElement unset()不起作用

时间:2012-04-02 20:33:39

标签: php xml

我有一个用密钥填充的xml文件,一旦使用了特定密钥,它将从xml文件中删除。下面的代码运行,但不会从xml文件中删除密钥。我在这里读到的可能是“&”在foreach()中将确保我正在使用实际的xml文件数据而不是foreach()创建的临时数据,但是我运行此代码时得到的只是;

Fatal error: An iterator cannot be used with foreach by reference in ....

xml文件

<proctor>
    <keys>
        <key>afvr3e</key>
        <key>578jyd</key>
        <key>hnr6rg</key>
        <key>890kg7</key>
        <key>hn3rgd</key>
    </keys>
</proctor>

php索引文件

$key = new ProctorKey('proctorKey.xml');
$key->DeleteKey('hnr6rg');

php类文件

class ProctorKey
{
    private $file;
    public function __construct($file)
    {
        $this->file = $file;
    }
    public function DeleteKey($keyToDelete)
    {
        $xml = simplexml_load_file($this->file)or die("Error: Cannot create object"); 
        /* this throws a fatal error
        *  foreach($xml->keys as &key)
        */
        foreach($xml->keys->key as $key)
        {
            if($key==$keyToDelete)
            {
                unset($key); 
                print('found');
            }
        }
        return $this->FormatXML($xml->asXML());
    }
    private function FormatXML($data)
    {
        $dom = new DOMDocument('1.0');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        $dom->loadXML($data);
        $dom->save($this->file);
        $response = ($dom)?true:false;
        return $response;
    }
}

3 个答案:

答案 0 :(得分:3)

下面的代码段有两种方式帮助:

  • 它使用XPath迭代一个只包含您要删除的key元素的数组
  • 它在实际元素而不是unset变量上调用$key(这也是SimpleXMLElement是一个可迭代对象的怪癖)。

<强>段

foreach($xml->xpath("keys/key[.='$keyToDelete']") as $key)
{
    unset($key[0]); 
}

答案 1 :(得分:0)

您的实施错误

替换

    foreach($xml->keys->key as $key)
    {
        if($key==$keyToDelete)
        {
            unset($key);
            print('found');
        }
    }

使用

    for($i = 0 ; $i < count($xml->keys->key); $i++)
    {
        if($xml->keys->key[$i] == $keyToDelete)
        {
            unset($xml->keys->key[$i]);
            print('found');
        }
    }

由于

:)

答案 2 :(得分:-1)

首先,修改您现在正在迭代的集合可能会导致不可预测的行为。其次,xml对象可能不仅仅是普通的std对象。也许,SimpleXML是不同的,但在XML DOM中,我使用的应该调用removeChildNode这样的特殊方法,而不仅仅是unset