2012-03-08 3 views
1

ОК, это сводит меня с ума.
Я пытаюсь разобрать XML-файл в конкретный массив или объект, поэтому я могу сравнить его с похожим файлом, чтобы проверить различия.
Однако мне не повезло. Я пытаюсь использовать SimpleXMLIterator и SimpleXMLElement для этого.
Вот некоторые примеры:Parse Xml file для сравнения

<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 на некоторое время тоже. Кроме того, я считаю, что вы должны использовать SimpleXMLElement, если вы планируете также редактировать XML. Если вы просто хотите прочитать его для сравнения, лучше всего использовать simplexml_load_file. Вы также можете просто изменить свой xpath.

xpath('//movie'); 
+0

xpath работал. Я вернусь после того, как выясню остальное. – RockyFord

0

Если вам просто нужно сравнить все содержимое файла, прочитать содержимое обоих файлов в строку и сделать строку сравнение. В противном случае вы можете сделать то же самое на более низком уровне документа, получив innerXML любого узла.

+0

сожалею об этом, я пытался что-то добавить к моему. Я сразу же удалил его – mseancole

+0

Не волнуйтесь, я отклонил редактирование. – aaroncatlin