2013-06-19 2 views
1

나는 한 번만 실행되는 foreach 루프를 가지고 있으며 저에게 어려움이 있습니다.SimpleXML 노드 제거

1 : 다음 XML 파일을로드하고, "코드"노드를 통해 반복해야 제가

2 ("구매", "삭제"또는 "요구"중 어느 하나)의 상태 값의 어레이를로드 자신의 상태를 업데이트,하지만 새로운 코드 인 경우

<content> 
.... lots of stuff 
<codes> 
<code date="xxx" status="request">xxxxx</code> 
.. repeat ... 
</codes> 
</content> 

.... I은 다음 하나

XML 구조에 이동하기 전에 그것을 제거하려면 "삭제"및 PHP 코드는 ... .

$newstatus = $_POST['updates']; 
$file = '../apps/templates/'.$folder.'/layout.xml'; 
$xml2 = simplexml_load_file($file); 
foreach($xml2->codes->code as $code){ 
    if($code['status'] == "delete") { 
     $dom=dom_import_simplexml($code); 
     $dom->parentNode->removeChild($dom); 
    } 
} 
$xml2->asXml($file); 

삭제 확인을 디버그 할 수 있도록 업데이트를 일시적으로 제거했습니다. 이것은 모두 작동하지만 첫 번째 삭제 만 제거하고 foreach 루프 일지라도 다른 모든 삭제는 남겨 둡니다. 도움을 주시면 감사하겠습니다.

+0

중복 질문은 http://stackoverflow.com/questions/3418197/how-to-remove-a-node-if-it-exists-with-simplexml?rq=1에서 답을 확인하십시오. –

+0

SimpleXML에서 [특정 속성을 가진 자식 제거 (*)] (* (http://stackoverflow.com/a/262556/367456))에서이 코드를 통해 복사 한 것일 수 있습니다. PHP] (http://stackoverflow.com/q/262351/367456) *. 문제는 주어진 답이 불안정하다는 것입니다. 이 코드의 문제점은 iterator가 삭제 된 후에 만 ​​단일 삭제를 위해 작성된다는 것입니다. 'iterator_to_array' 또는 xpath를 사용하여 특정의 simplexml의 경우 먼저 배열로 변환해야합니다. http://stackoverflow.com/a/16062633/367456 – hakre

답변

13

동일한 반복에서 여러 번 삭제하는 것은 불안정합니다. 예 : 두 번째 요소를 제거하면 세 번째 요소가 두 번째 요소가됩니다. 당신이 그것을 반복하면서 안정 배열에 따라 요소를

$elementsToRemove = array(); 
foreach ($xml2->codes->code as $code) { 
    if ($code['status'] == "delete") { 
     $elementsToRemove[] = $code; 
    } 
} 

을 그리고 당신은 제거 :

먼저 배열로 삭제하는 요소를 저장하여 그것을 방지 할 수

foreach ($elementsToRemove as $code) { 
    unset($code[0]); 
} 

배열을 직접 반환하는 xpath 쿼리에 if-condition을 넣을 수도 있고 (예 : the duplicate question 참조) iterator_to_array()을 사용하여 if-condition을 넣을 수도 있습니다.

+1

이것은 정말 유용한 답변입니다. 나는이 상황에 두 번이나 빠져 있었고 두 번 모두 나를 구해 냈습니다. 어쩌면 다음에 실제로 기억할지도 모릅니다. – PaulSkinner

+0

고마워요.이 같은 코드로 작동했습니다. ** $ xml = 새 SimpleXMLElement ($ rs_xml); $ elementsToRemove = array(); $ ($ element-> guid == "http://www.example.com/?p=2385281") { $ elementsToRemove [] = $ 요소; } } foreach ($ elementsToRemove as $ code) { unset ($ code [0]); } ** – ziggrat