首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在php中运行单个脚本时,所有xml标记都不会被删除。

在php中运行单个脚本时,所有xml标记都不会被删除。
EN

Stack Overflow用户
提问于 2012-08-08 02:18:52
回答 2查看 54关注 0票数 1

我有以下xml:

代码语言:javascript
复制
<?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标签。

我是从下面的代码中这样做的。

代码语言:javascript
复制
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的方式,这是怎么发生的?

我要把它们一下子都删了。请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-08 02:38:02

foreach与从DOMNodeList中删除元素结合使用是很麻烦的。当元素被移除时,列表会被就地更改,但foreach不会对此进行补偿。

DOM中的

NodeList和NamedNodeMap对象是活动的;也就是说,对底层文档结构的更改反映在所有相关的NodeList和NamedNodeMap对象中。

- The DOM Structure Model

两种常见的方法是:

  1. Build一个要移除的元素集合,然后移除它们

foreach ($conv as $conversation) { if ($ $conversation->parentNode->removeChild($conversation);}

  • Remove ->getAttribute(‘email’) == $this->adminEmail) { $to_delete[] = $conversation;}} foreach ($to_delete as $conversation) {列表中的第一个元素,直到不再有为止

在($ $xpath->query('/server/conversation@email="'.$this->adminEmail.'"');->length> 0) { $conv->item(0)->parentNode->removeChild($conv->item(0));} $conv ($conv->length >0){conv=长度

票数 2
EN

Stack Overflow用户

发布于 2012-08-08 02:27:17

我认为这是由于您操纵了您正在遍历的集合。尝试创建数组的副本,如下所示:

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11851780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档