2012-03-08 5 views
1

これは私を夢中にしています。
私はxmlファイルを特定の配列またはオブジェクトに解析しようとしていますので、類似のファイルと比較して違いをテストできます。
しかし私は運がなかった。私はこれを行うためにSimpleXMLIteratorとSimpleXMLElementを使用しようとしています。ここ
は、いくつかのサンプルです:ここでは比較のためにXmlファイルを解析します。

<xml> 
//This is the first record of 1073 
    <viddb> 
     <movies>1074</movies> 
     <movie> 
      <title>10.5</title> 
      <origtitle>10.5</origtitle> 
      <year>2004</year> 
      <genre>Disaster</genre> 
      <release></release> 
      <mpaa></mpaa> 
      <director>John Lafia</director> 
      <producers>Howard Braunstein, Jeffrey Herd</producers> 
      <actors>Kim Delaney, Fred Ward, Ivan Sergei</actors> 
      <description>An earthquake reaching a 10.5 magnitude on the Richter scale, strikes the west coast of the U.S. and Canada. A large portion of land falls into the ocean, and the situation is worsened by aftershocks and tsunami.</description> 
      <path>E:\www\Media\Videos\Disaster\10.5.mp4</path> 
      <length>164</length> 
      <size>3648</size> 
      <resolution>640x272</resolution> 
      <framerate>29.97</framerate> 
      <videocodec>AVC</videocodec> 
      <videobitrate>2966</videobitrate> 
      <label>Roku Media</label> 
      <poster>images/10.5.jpg</poster> 
     </movie> 

は、このレコードは私が(現時点では)を生成しようとしているが、それぞれのための単一レベルの連想配列である$iter = new SimpleXMLIterator($xml, 0, TRUE);

object(SimpleXMLIterator)#71 (1) { 
    ["viddb"] => object(SimpleXMLIterator)#72 (2) { 
    ["movies"] => string(4) "1074" 
    ["movie"] => array(1074) { 
     [0] => object(SimpleXMLIterator)#73 (19) { 
     ["title"] => string(4) "10.5" 
     ["origtitle"] => string(4) "10.5" 
     ["year"] => string(4) "2004" 
     ["genre"] => string(8) "Disaster" 
     ["release"] => object(SimpleXMLIterator)#1158 (0) { 
     } 
     ["mpaa"] => object(SimpleXMLIterator)#1159 (0) { 
     } 
     ["director"] => string(10) "John Lafia" 
     ["producers"] => string(31) "Howard Braunstein, Jeffrey Herd" 
     ["actors"] => string(35) "Kim Delaney, Fred Ward, Ivan Sergei" 
     ["description"] => string(212) "An earthquake reaching a 10.5 magnitude on the Richter scale, strikes the west coast of the U.S. and Canada. A large portion of land falls into the ocean, and the situation is worsened by aftershocks and tsunami." 
     ["path"] => string(37) "E:\www\Media\Videos\Disaster\10.5.mp4" 
     ["length"] => string(3) "164" 
     ["size"] => string(4) "3648" 
     ["resolution"] => string(7) "640x272" 
     ["framerate"] => string(5) "29.97" 
     ["videocodec"] => string(3) "AVC" 
     ["videobitrate"] => string(4) "2966" 
     ["label"] => string(10) "Roku Media" 
     ["poster"] => string(15) "images/10.5.jpg" 
     } 

を使用して生成したオブジェクトであります映画。私が読んだ後に続けたすべての例は、常に配列の配列を生成しました。た

これはされて私がでている:私はシンプルかつ明白な何かが欠けてるよう

$iter = new SimpleXMLIterator($xml, 0, TRUE); 
     Zend_Debug::dump($iter); 
     //so far xpath has not worked for me, I can't get $result to return anything 
     $result = $iter->xpath('/xml/viddb/movies/movie'); 
     $movies = array(); 
     for ($iter->rewind(); $iter->valid(); $iter->next()) { 
      foreach ($iter->getChildren() as $key => $value) { 
       //I can get each movie title to echo but when I try to put them into an 
       // array it only has the last record 
       echo $value->title . '<br />'; 
       $movies['title'] = $value->title; 

      } 
     } 
     return $movies; 

私は感じて...いつものように:)私は私の誤りを発見した[EDIT] 、私はつまずきましたオブジェクトの配列の上に物事。私が望むように文字列としてデータをキャストしなければならなかった。ただ、情報のために、ここで私は私が望んでいたトラックに私を置くために思い付いたものです:

public function indexAction() { 
     $xml = APPLICATION_PATH . '/../data/Videos.xml'; 
     $iter = new SimpleXMLElement($xml, 0, TRUE); 
     $result = $iter->xpath('//movie'); 

     $movies = array(); 
     foreach ($result as $key => $movie) { 
      $movies[$key + 1] = (string) $movie->title; 
     } 
     Zend_Debug::dump($movies, 'Movies'); 
    } 
+0

あなたは '$ movies ['title'] [] = $ value-> title;'を試しましたか? – maialithar

答えて

0

XPATHは、あなたが探している答えです。私はあなたのXPATHが動作していない理由は、映画ノードが子供を持たないときに映画ノードの下の映画ノードを探しているからだと思います。

編集:イテレータの代わりにforeachループを使用するほうが簡単かもしれないと考えてください。以前は見たことのないイテレータを見なければなりませんでした。 simplexmlとxpathをしばらく使用していました。また、XMLの編集を計画している場合は、SimpleXMLElementのみを使用してください。比較のためにそれを読みたい場合は、simplexml_load_fileを使用するのが最善です。 xpathを簡単に変更することもできます。

​​
+0

xpathが機能しました。私は残りの部分を把握した後、私は戻ってきます。 – RockyFord

0

あなただけの、ファイル全体の内容を比較する文字列に両方のファイルの内容を読み込み、文字列操作を行う必要がある場合比較。それ以外の場合は、ノードのinnerXMLを取得して、ドキュメントの下位レベルで同じことを行うことができます。

+0

申し訳ありませんが、私は何かを私のものに追加しようとしていました。私はすぐにそれを削除しました – mseancole

+0

心配しないで、私は編集を拒否しました。 – aaroncatlin