2012-03-10 11 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を指示します。


はさておき1つだけの要素が一致した場合でも、

  • xpath()アレイを返す:ここで[0]ための2つの存在です。したがって、[0]は、その配列の最初の項目を取得するために使用されます。これは、削除する要素です。
  • $node[0]から返されたSimpleXMLElementは、<event>要素のコレクションを表します(ただし、要素/属性にアクセスすると、コレクションの最初の値が使用されます)。したがって、[0]を使用して、削除したい実際のSimpleXMLElementを取得します。これは、この魔法のコレクションの最初のものです。
+0

お返事ありがとうございます。私はDOMとしてノードにアクセスできるようにしたいので、他のオプションを使用しました。 – user823527

+6

これはあなたの質問に尋ねたものではありません。 – salathe