我有一个用密钥填充的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;
}
}
答案 0 :(得分:3)
下面的代码段有两种方式帮助:
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
。