2012-04-02 2 views
1

xmlファイルにキーが設定されていて、特定のキーが使用されるとxmlファイルから削除されます。以下のコードは実行されますが、キーはXMLファイルから削除されません。私はここでは、foreach()に "&"を入れると、foreach()で作成された一時的なデータではなく、実際のxmlファイルのデータで作業していることを確認できます。 ;SimpleXMLElement unset()が動作しません

Fatal error: An iterator cannot be used with foreach by reference in ....

xmlファイル

<proctor> 
    <keys> 
     <key>afvr3e</key> 
     <key>578jyd</key> 
     <key>hnr6rg</key> 
     <key>890kg7</key> 
     <key>hn3rgd</key> 
    </keys> 
</proctor> 

PHPのインデックスファイル

$key = new ProctorKey('proctorKey.xml'); 
$key->DeleteKey('hnr6rg'); 

PHPのクラスファイルのすべての

class ProctorKey 
{ 
    private $file; 
    public function __construct($file) 
    { 
     $this->file = $file; 
    } 
    public function DeleteKey($keyToDelete) 
    { 
     $xml = simplexml_load_file($this->file)or die("Error: Cannot create object"); 
     /* this throws a fatal error 
     * foreach($xml->keys as &key) 
     */ 
     foreach($xml->keys->key as $key) 
     { 
      if($key==$keyToDelete) 
      { 
       unset($key); 
       print('found'); 
      } 
     } 
     return $this->FormatXML($xml->asXML()); 
    } 
    private function FormatXML($data) 
    { 
     $dom = new DOMDocument('1.0'); 
     $dom->preserveWhiteSpace = false; 
     $dom->formatOutput = true; 
     $dom->loadXML($data); 
     $dom->save($this->file); 
     $response = ($dom)?true:false; 
     return $response; 
    } 
} 

答えて

2

スニペットは、ワット二つの鍵に役立ちますAYS:

  • それはあなたが
  • それは(それがSimpleXMLElementの癖だ実際の要素ではなく、$key変数にunsetを呼び出しを削除することだけkey要素(複数可)を含む配列を反復処理するためにXPathを使用しています反復可能なオブジェクトでもあります)。

スニペット

foreach($xml->xpath("keys/key[.='$keyToDelete']") as $key) 
{ 
    unset($key[0]); 
} 
+0

残念ながら、これはうまくいきませんでした。別のキーを削除しようとしましたが、私はxpathで読み上げるつもりです、私はコードの外観が好きです:) – Mike

+0

あなたはそれがうまくいかなかったと言います、それは何ですか?それは私のためにいいです - http://codepad.viper-7.com/w11l8U – salathe

+0

私はコードを実行すると、それは正常に実行され、エラーはありません。しかし、私はxmlファイルを見ると、私はまだキーを参照してください。私はあなたのコードがコードパッドで少し違っていることに気付きました...私は、あなたがそこに持っている方法とまったく同じ方法でクイックテストファイルを作成し、何が起こるか見るつもりです。私はすぐに戻ってくるだろう;) – Mike

-1

まず、WHのコレクションを変更しますあなたが今反復していると、予期しない動作につながる可能性があります。第2に、xmlオブジェクトは正確に単純な標準オブジェクトではなく動作します。たぶん、SimpleXMLが違うかもしれませんが、XML DOMでは、unsetだけでなく、removeChildNodeのような特殊なメソッドを呼び出す必要があります。

+0

私はXML DOMは、よりよい解決策であることを何度も読んだことがある...私は、もしかしたら私が行方不明になった簡単な何かがあったと思いました。私はこれを動作させるために、私たちが話すようにXML DOMを読んでいます。本当にそれほどシンプルでないのなら、なぜSimpleXMLと呼ぶのですか? lol – Mike

+0

実際には簡単な操作では「軽く」簡単です。私が選んだとき、私はXML DOMを使用することに決めました。私はすでに知っていたjsのHTML DOMと同じようにします。 – kirilloid

+0

なぜ誰かがこれを下降させ、理由を説明しないでしょうか? – Mike

0

あなたの実装が間違っている

for($i = 0 ; $i < count($xml->keys->key); $i++) 
    { 
     if($xml->keys->key[$i] == $keyToDelete) 
     { 
      unset($xml->keys->key[$i]); 
      print('found'); 
     } 
    } 

foreach($xml->keys->key as $key) 
    { 
     if($key==$keyToDelete) 
     { 
      unset($key); 
      print('found'); 
     } 
    } 

を交換して、以下のおかげ

:)

+0

馬場さんに感謝しますが、それでもキーを削除しませんでした。スクリプトを実行すると、 'found'が表示されますが、ファイルから削除されませんでした:( – Mike

関連する問題