2012-08-07 2 views
1

에 하나의 스크립트 실행에서 삭제되지 않습니다 난 다음 XML했습니다 :모든 XML 태그는 PHP

<?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 번만 작동합니다 .i. 3 records 만 삭제합니다. 다음에 스크립트를 실행할 때 하나의 레코드를 삭제하고 다음 번에 하나의 레코드를 삭제합니다. 이렇게하면 5 개의 레코드가 모두 삭제됩니다. 왜 이런 일이 발생합니까?

한번에 모두 삭제하고 싶습니다. 도와주세요.

답변

2

DOMNodeList로부터 요소를 제거하는 결합 foreach 사용하기 곤란하다. 요소가 제거되면 목록은 내부에서 변경되지만 foreach은이를 보완하지 않습니다.

DOM의 NodeList 및 NamedNodeMap 객체는 라이브입니다. 즉, 기본 문서 구조에 대한 변경 사항이 모든 관련 NodeList 및 NamedNodeMap 객체에 반영됩니다.

- The DOM Structure Model

두 가지 일반적인 방법은 다음과 같습니다

  1. 제거 할 요소의 컬렉션을 구축 한 후 첫 번째 요소를 제거 그들에게

    foreach ($conv as $conversation) 
    { 
        if ($conversation->getAttribute('email') == $this->adminEmail) 
        { 
         $to_delete[] = $conversation; 
        } 
    } 
    
    foreach ($to_delete as $conversation) 
    { 
        $conversation->parentNode->removeChild($conversation); 
    } 
    
  2. 을 제거 목록에서 이 때까지 response.But에 대한

    $conv = $xpath->query('/server/conversation[@email="'.$this->adminEmail.'"]'); 
    while ($conv->length > 0) 
    { 
        $conv->item(0)->parentNode->removeChild($conv->item(0)); 
    } 
    
+0

덕분에 일했습니다. 오늘도 C#에서 같은 실수를 저질렀습니다. :) 나. – Mj1992

0

나는 이것이 당신이 반복하고있는 세트를 조작하고 있기 때문이라고 생각합니다. 그래서 같은 배열의 카피를 만드는 시도 :

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

thnx 더 이상 그것은 작동하지 않았다. – Mj1992

+0

아마 전체 클래스를 제공 할 수 있습니까? 인스턴스화하는 방법은 무엇입니까? –

+0

도움말에 대한 thnx @ 마침내 나는 salathe의 대답에서 해결했습니다. – Mj1992

관련 문제