我有以下xml:
<?xml version="1.0" encoding="utf-8"?>
<server>
<gcm regId="APA91-yySYdx_Ydvkl2pQNB54yDpJRq4SnWvJCpsaCm6hT3LlXqP1S-3uTiXlXwylPKmrFSZbsA" email="mozi"/>
<conversation ip="mozi1" email="mozi">
<chat>abc</chat>
</conversation>
<conversation ip="mozi1" email="mozi">
<chat>abc</chat>
</conversation>
<conversation ip="mozi1" email="mozi">
<chat>abc</chat>
</conversation>
<conversation ip="mozi1" email="mozi">
<chat>abc</chat>
</conversation>
<conversation ip="mozi1" email="mozi">
<chat>abc</chat>
</conversation>
</server>我想删除email=mozi所在位置的所有conversation标签。
我是从下面的代码中这样做的。
public function DeleteConversation()
{
$conv=$this->xmlDom->getElementsByTagName("conversation");
foreach ($conv as $conversation)
{
if ($conversation->getAttribute('email') == $this->adminEmail)
{
$this->xmlDom->documentElement->removeChild($conversation);
}
}
$this->SaveChanges();
}现在,当我运行脚本时,这个函数被调用。这个循环只工作3次,也就是说,它只删除3 records,.When,下一次,我运行脚本,删除一条记录,下一次,这就是所有五条记录获取deleted.Why的方式,这是怎么发生的?
我要把它们一下子都删了。请帮帮忙。
发布于 2012-08-08 02:38:02
将foreach与从DOMNodeList中删除元素结合使用是很麻烦的。当元素被移除时,列表会被就地更改,但foreach不会对此进行补偿。
DOM中的
NodeList和NamedNodeMap对象是活动的;也就是说,对底层文档结构的更改反映在所有相关的NodeList和NamedNodeMap对象中。
- The DOM Structure Model
两种常见的方法是:
foreach ($conv as $conversation) { if ($ $conversation->parentNode->removeChild($conversation);}
在($ $xpath->query('/server/conversation@email="'.$this->adminEmail.'"');->length> 0) { $conv->item(0)->parentNode->removeChild($conv->item(0));} $conv ($conv->length >0){conv=长度
发布于 2012-08-08 02:27:17
我认为这是由于您操纵了您正在遍历的集合。尝试创建数组的副本,如下所示:
public function DeleteConversation()
{
$conv=$this->xmlDom->getElementsByTagName("conversation");
$copy = $conv;
foreach ($copy as $conversation)
{
if ($conversation->getAttribute('email') == $this->adminEmail)
{
$this->xmlDom->documentElement->removeChild($conversation);
}
}
$this->SaveChanges();
}https://stackoverflow.com/questions/11851780
复制相似问题