За последние 24 часа нас посетили 17582 программиста и 1310 роботов. Сейчас ищут 844 программиста ...

Парсер xml с циклом

Тема в разделе "PHP для новичков", создана пользователем Previous, 22 дек 2013.

  1. Previous

    Previous Новичок

    С нами с:
    22 дек 2013
    Сообщения:
    14
    Симпатии:
    0
    Здравствуйте, пожалуйста не ругайте сильно, но я у вас Новенький. Суть проблемы в следующем, пытаюсь написать парсер расписания поездов на php. Есть xml файл http://train.votpusk.ru/xml_utf/2000000.xml

    Код (Text):
    1. $file = "http://train.votpusk.ru/xml_utf/2000000.xml";
    2. function parse($file, $from, $to){
    3.         $content = file_get_contents($file);
    4.         $pos = strpos($content, $from);
    5.         $content = substr($content, $pos);
    6.         $pos = strpos($content, $to);
    7.         $content = substr($content, 0, $pos);
    8.     $content = str_replace('< a href= >','',$content);
    9.         preg_match_all('!<numb>(.*?)</numb>!si', $content, $out, PREG_PATTERN_ORDER);
    10.         return $out[0];
    11. }
    12. foreach ($parse as $link){
    13. echo $link.'< br />';
    14. //Так же здесь я буду записывать все полученные данные в БД.
    15. }
    В пхп почти не шарю =( помогите написать нормальный парсер. спасибо.
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    php.net/manual/ru/refs.xml.php
    php.net/manual/ru/book.simplexml.php
     
  3. Previous

    Previous Новичок

    С нами с:
    22 дек 2013
    Сообщения:
    14
    Симпатии:
    0
    почему у меня белая страница?

    Код (Text):
    1. <?php
    2.  
    3. #$file = "http://train.votpusk.ru/xml_utf/2048090.xml";
    4.  
    5. function callMe($param) {
    6. #    $search = array('byUsername' => 'dynsql');
    7.    
    8. #  if (isset($search[$param[1]])) {
    9.         return sprintf($param[2], $search[$param[1]]);
    10. #  }
    11.    
    12.     return "";
    13. }
    14.  
    15. $xml = simplexml_load_file("http://train.votpusk.ru/xml_utf/2000000.xml");
    16. $string = $xml->statement->asXML();
    17. $string = preg_replace_callback('/<numb>(.*?)<\/numb>/', 'callMe', $string);
    18. $node = simplexml_load_string($string);
    19. echo $node;
    20. ?>
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    }
    Забыли в конце function callMe сделать так:
    # }
    И вообще, что-за чушь вы написали, оно не будет работать.
    Код (PHP):
    1. $xml=simplexml_load_file("http://train.votpusk.ru/xml_utf/2000000.xml");
    2. foreach($xml->station->date->train as $value) {
    3.     echo nl2br($value->numb.'
    4.     ');
    5. }
     
  5. Previous

    Previous Новичок

    С нами с:
    22 дек 2013
    Сообщения:
    14
    Симпатии:
    0
    Подскажите пожалуйста, сейчас вытаскиваются все данные кроме дат, это потому что даты находятся не в элементе train, если убрать train из foreach то даты вытаскиваются нормально, пытался сделать вот так

    Код (Text):
    1. $xml=simplexml_load_file("http://train.votpusk.ru/xml_utf/2000000.xml");
    2.  
    3.     foreach($xml->station->date as $value2) {
    4.  
    5. #echo $value2->day;
    6. #echo $value2->train->numb;
    7.        
    8. $day = nl2br($value2->day.'');
    9. $month = nl2br($value2->month.'');
    10. $year = nl2br($value2->year.'');
    11.  
    12. $numb = nl2br($value2->train->numb.'');
    13. $type = nl2br($value2->train->type.'');
    14. $dep_station = nl2br($value2->train->dep_station.'');
    15. $arr_station = nl2br($value2->train->arr_station.'');
    16. $arr_time = nl2br($value2->train->arr_time.'');
    17. $date_start = date("Y-m-d");
    18.  
    19. $db->setQuery("INSERT INTO schedule (`day`, `month`, `year`, `numb`, `type`, `dep_station`, `arr_station`, `arr_time`, `date_start`) VALUES ('{$day}', '{$month}', '{$year}', '{$numb}', '{$type}', '{$dep_station}', '{$arr_station}', '{$arr_time}', '{$date_start}')");
    20. $db->query();
    21.    
    22.     }
    Что посоветуете?
     
  6. Previous

    Previous Новичок

    С нами с:
    22 дек 2013
    Сообщения:
    14
    Симпатии:
    0
    Как соединить даты с доп инфой?
     
  7. Previous

    Previous Новичок

    С нами с:
    22 дек 2013
    Сообщения:
    14
    Симпатии:
    0
    Сделал вот такой вот вариант
    Код (Text):
    1. foreach ($xml->station->date->train as $value) {
    2.  
    3.     $numb = nl2br($value->train->numb.'');
    4.     $type = nl2br($value->train->type.'');
    5.     $dep_station = nl2br($value->train->dep_station.'');
    6.     $arr_station = nl2br($value->train->arr_station.'');
    7.     $arr_time = nl2br($value->train->arr_time.'');
    8.     $date_start = date("Y-m-d");
    9.  
    10.     $db->setQuery("INSERT INTO #__schedule (`day`, `month`, `year`, `numb`, `type`, `dep_station`, `arr_station`, `arr_time`, `date_start`) VALUES ('{$day}', '{$month}', '{$year}', '{$numb}', '{$type}', '{$dep_station}', '{$arr_station}', '{$arr_time}', '{$date_start}')");
    11.     $db->query();
    12.  
    13.         $query ='SELECT id FROM #__schedule ORDER BY id DESC LIMIT 1'; 
    14.         $db->setQuery($query);
    15.         $end_rf = $db->loadObject();    
    16.  
    17.         foreach ($xml->station->date as $value2) {
    18.                 $day = nl2br($value2->day.'');
    19.                 $month = nl2br($value2->month.'');
    20.                 $year = nl2br($value2->year.'');
    21.  
    22.                 $db->setQuery("UPDATE #__schedule SET day='$day', month='$month', year='$year' WHERE id='$end_rf' LIMIT 1");
    23.                 $db->query();
    24.  
    25.         }
    26. }
    Но почему то не работает =( пишет Catchable fatal error: Object of class stdClass could not be converted to string in /home/data/www/components/com_schedule/views/crons/tmpl/default.php on line 45

    Хелп ми.

    Добавлено спустя 36 секунд:
    Жалуется на
    Код (Text):
    1. $db->setQuery("UPDATE #__schedule SET day='$day', month='$month', year='$year' WHERE id='$end_rf' LIMIT 1");
    Строчку.
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $xml=simplexml_load_file("http://train.votpusk.ru/xml_utf/2000000.xml");
    2. foreach($xml->station->date as $keyDate => $valueDate) {
    3.     echo nl2br('Day: '.$valueDate->day.'
    4.     Month: '.$valueDate->month.'
    5.     Year: '.$valueDate->year.'
    6.     ');
    7.     if(is_object($valueDate->train)) {
    8.         foreach($valueDate->train as $keyTrain => $valueTrain) {
    9.             echo nl2br('Numb: '.$valueTrain->numb.'
    10.             Type: '.$valueTrain->type.'
    11.             ');
    12.         }
    13.     }
    14. } 
     
  9. Previous

    Previous Новичок

    С нами с:
    22 дек 2013
    Сообщения:
    14
    Симпатии:
    0
    Подскажите пожалуйста, пытаюсь сделать запись в бд. вот мой код

    Код (Text):
    1. foreach($xml->station->date as $keyDate => $valueDate) {
    2.  
    3.     $day = nl2br($valueDate->day);
    4.     $month = nl2br($valueDate->month);
    5.     $yeat = nl2br($valueDate->year);
    6.  
    7.     $db->setQuery("INSERT INTO #__schedule (`day`, `month`, `year`) VALUES ('{$day}', '{$month}', '{$year}')");
    8.     $db->query();
    9.  
    10.  
    11.     if(is_object($valueDate->train)) {
    12.         foreach($valueDate->train as $keyTrain => $valueTrain) {
    13.  
    14.         $query ='SELECT id FROM #__schedule ORDER BY id DESC LIMIT 1'; 
    15.         $db->setQuery($query);
    16.         $end_rf = $db->loadObject();    
    17.  
    18.         $numb = nl2br($valueTrain->numb);
    19.         $type = nl2br($valueTrain->type);
    20.         $dep_station = nl2br($valueTrain->dep_station);
    21.         $arr_station = nl2br($valueTrain->arr_station);
    22.         $arr_time = nl2br($valueTrain->arr_time);
    23.         $date_start = nl2br($valueTrain->date_start);
    24.  
    25.         $db->setQuery("UPDATE #__schedule SET numb='$numb', type='$type', dep_station='$dep_station', arr_station='$arr_station', arr_time='$arr_time', date_start='$date_start' WHERE id='$end_rf' LIMIT 1");
    26.         $db->query();
    27.  
    28.         }
    29.     }
    30. }
    Пишет Catchable fatal error: Object of class stdClass could not be converted to string in /home/components/com_schedule/views/crons/tmpl/default.php on line 45
    Жалуется на эту строчку
    Код (Text):
    1. db->setQuery("UPDATE #__schedule SET numb='$numb', type='$type', dep_station='$dep_station', arr_station='$arr_station', arr_time='$arr_time', date_start='$date_start' WHERE id='$end_rf' LIMIT 1");
    Подскажите что я не так делаю? где я туплю? 100% моя неопытность...
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Этж, <матное слово>.
    Я валяюсь =)
    Вы бы сначала прочитали бы, что за функция nl2br, на какой хрен ее писать к каждой переменной ? ОМГ!
    И даже такое повидать приходится =)
    Извращенец :D
    Скорее проблема в $end_rf = $db->loadObject(); // объект, который не конвертируется в строку.

    И делайте экранирование за место nl2br напишите (mysql | mysqli)_real_escape_string - смотря, что вы там используете ( mysql или mysqli ) рекомендую mysqli.

    Хотя $db->есть видимо уже экранирование строк. Найдите это.