2012-03-10 4 views
3

나는 나는이 PHP 함수를, 이벤트를 삭제하려면이 구조삭제 simplexmlelement 노드

<?xml version="1.0" encoding="iso-8859-1"?> 
<my_events> 
         <event id="e20111129215359"> 
          <title>the title</title> 
          <channel id="1"> 
           <name>A name</name> 
           <onclick></onclick> 
          </channel> 
          <event_site> 
           <name/> 
           <url/> 
          </event_site> 
          <start_date>Thu Mar 08 2012</start_date> 
          <start_time>11:00 AM</start_time> 
          <end_date>null</end_date> 
          <end_time>null</end_time> 
          <notes>Notes for the event</notes> 
         </event> 
</my_events> 

의 XML 파일이 있습니다.

<?php 

include_once("phpshared.php"); 

function delete_event($nodeid) { 

    $nodes = new SimpleXMLElement('my_events.xml', LIBXML_NOCDATA, true); 

    $node = $nodes->xpath("/my_events/event[@id='$nodeid']"); 

    $node->parentNode->removeChild($node); 

    $formatted = formatXmlString($nodes->asXML()); 
    $file = fopen ('my_events.xml', "w"); 
    fwrite($file, $formatted); 
    fclose ($file); 

} 

echo delete_event(trim($_REQUEST['nodeid'])); 

?> 

노드를 삭제하지 않습니다. 이 작업을 수행하는 다른 방법이 있습니까?

답변

14

SimpleXML을은 PHP의 unset() 키워드를 통해 요소를 제거 할 수 있습니다. XPath 쿼리가 일치하는 <event> 요소를 반환하는 경우

당신의 코드에 대한

, 단순히

if (! empty($node)) { 
    unset($node[0][0]); 
} 

$node->parentNode->removeChild($node); 

교체, 우리는 그것을 unset()에 SimpleXML을 지시합니다.


는 제외 : 하나의 요소가 일치하는 경우에도

  • xpath() 배열을 반환 여기 [0] 때문에이 명 발생합니다. 따라서 [0]은 해당 배열의 첫 번째 항목을 가져 오는 데 사용됩니다.이 요소는 삭제하려는 요소입니다.
  • $node[0]에서 반환 된 SimpleXMLElement는 <event> 요소의 컬렉션을 나타냅니다 (그러나 요소/속성에 액세스하면 컬렉션의 첫 번째 값이 사용됩니다). 따라서 우리는 [0]을 사용하여 삭제하고자하는 실제 SimpleXMLElement을 얻습니다.이 마법 수집의 첫 번째 항목입니다.
+0

답변 해 주셔서 감사합니다. 노드로 DOM에 액세스 할 수 있기를 원했기 때문에 다른 옵션을 사용했습니다. – user823527

+6

질문에 대한 질문이 아닙니다. – salathe