За последние 24 часа нас посетили 22369 программистов и 1032 робота. Сейчас ищут 672 программиста ...

XML правильно распарсить

Тема в разделе "Решения, алгоритмы", создана пользователем trollik, 5 сен 2016.

  1. trollik

    trollik Новичок

    С нами с:
    18 апр 2016
    Сообщения:
    13
    Симпатии:
    0
    Доброго времени. Есть XML. Подскажите как правильнее распарсить, потом нужно будет передавать в Smarty, но не суть. Получил архив, но даже перебрать его толком не могу. Вот XML и полученный архив:
    Код (Text):
    1. <?xml version="1.0"?>
    2. <mtechno>
    3.     <routes>
    4.         <route routeCode="00035" routeName="Діма Т4">
    5.             <Days>
    6.                 <Day dayOfWeeks="Понедельник" hours="09:40; 18:00"/>
    7.                 <Day dayOfWeeks="Вторник" hours="18:00"/>
    8.                 <Day dayOfWeeks="Среда" hours="18:00"/>
    9.                 <Day dayOfWeeks="Четверг" hours="18:00"/>
    10.                 <Day dayOfWeeks="Пятница" hours="18:00"/>
    11.             </Days>
    12.         </route>
    13.         <route routeCode="00018" routeName="Хуст - Іршава">
    14.             <Days>
    15.                 <Day dayOfWeeks="Понедельник" hours="12:50"/>
    16.                 <Day dayOfWeeks="Вторник" hours="12:50"/>
    17.                 <Day dayOfWeeks="Среда" hours="12:50"/>
    18.                 <Day dayOfWeeks="Четверг" hours="12:50"/>
    19.                 <Day dayOfWeeks="Пятница" hours="12:50"/>
    20.                 <Day dayOfWeeks="Суббота" hours="12:50"/>
    21.             </Days>
    22.         </route>
    23.     </routes>
    24. </mtechno>
    PHP:
    1. array(1) { ["mobtech"]=> array(1) { ["routes"]=> array(1) { ["route"]=> array(2) { [0]=> array(2) { ["attr"]=> array(2) { ["routeCode"]=> string(5) "00035" ["routeName"]=> string(12) "Діма Т4" } ["Days"]=> array(1) { ["Day"]=> array(5) { [0]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(22) "Понедельник" ["hours"]=> string(12) "09:40; 18:00" } } [1]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Вторник" ["hours"]=> string(5) "18:00" } } [2]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(10) "Среда" ["hours"]=> string(5) "18:00" } } [3]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Четверг" ["hours"]=> string(5) "18:00" } } [4]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Пятница" ["hours"]=> string(5) "18:00" } } } } } [1]=> array(2) { ["attr"]=> array(2) { ["routeCode"]=> string(5) "00018" ["routeName"]=> string(23) "Хуст - Іршава" } ["Days"]=> array(1) { ["Day"]=> array(6) { [0]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(22) "Понедельник" ["hours"]=> string(5) "12:50" } } [1]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Вторник" ["hours"]=> string(5) "12:50" } } [2]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(10) "Среда" ["hours"]=> string(5) "12:50" } } [3]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Четверг" ["hours"]=> string(5) "12:50" } } [4]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Пятница" ["hours"]=> string(5) "12:50" } } [5]=> array(1) { ["attr"]=> array(2) { ["dayOfWeeks"]=> string(14) "Суббота" ["hours"]=> string(5) "12:50" } } } } } } } } }
    не могу получить routeName в цикле. Замучался.
     
  2. TimZ

    TimZ Новичок

    С нами с:
    2 сен 2016
    Сообщения:
    17
    Симпатии:
    9
    Код (Text):
    1. <?php
    2. $s = <<<XML
    3. <?xml version="1.0"?>
    4. <mtechno>
    5.     <routes>
    6.         <route routeCode="00035" routeName="Діма Т4">
    7.             <Days>
    8.                 <Day dayOfWeeks="Понедельник" hours="09:40; 18:00"/>
    9.                 <Day dayOfWeeks="Вторник" hours="18:00"/>
    10.                 <Day dayOfWeeks="Среда" hours="18:00"/>
    11.                 <Day dayOfWeeks="Четверг" hours="18:00"/>
    12.                 <Day dayOfWeeks="Пятница" hours="18:00"/>
    13.             </Days>
    14.         </route>
    15.         <route routeCode="00018" routeName="Хуст - Іршава">
    16.             <Days>
    17.                 <Day dayOfWeeks="Понедельник" hours="12:50"/>
    18.                 <Day dayOfWeeks="Вторник" hours="12:50"/>
    19.                 <Day dayOfWeeks="Среда" hours="12:50"/>
    20.                 <Day dayOfWeeks="Четверг" hours="12:50"/>
    21.                 <Day dayOfWeeks="Пятница" hours="12:50"/>
    22.                 <Day dayOfWeeks="Суббота" hours="12:50"/>
    23.             </Days>
    24.         </route>
    25.     </routes>
    26. </mtechno>
    27. XML;
    28. $obj_xml = new SimpleXMLElement($s);
    29.  
    30.  
    31. foreach ($obj_xml->routes->route as $route )
    32. {
    33.     print_r($route["routeName"]);
    34. }
    35. ?>
     
    trollik и denis01 нравится это.
  3. trollik

    trollik Новичок

    С нами с:
    18 апр 2016
    Сообщения:
    13
    Симпатии:
    0
    Да действительно. Спасибо. Правда XML получаю в переменную, но хоть работает. Не мог понять.
     
  4. trollik

    trollik Новичок

    С нами с:
    18 апр 2016
    Сообщения:
    13
    Симпатии:
    0
    Подскажите пожалуйста не могу разобраться, как получить значение dayOfWeeks маршрута "Діма Т4", как обрабатывать этот объект, получить значение "Діма Т4" "Понедельник", спасибо.
     
  5. TimZ

    TimZ Новичок

    С нами с:
    2 сен 2016
    Сообщения:
    17
    Симпатии:
    9
    Код (Text):
    1.  
    2. $obj_xml = new SimpleXMLElement($s);
    3. foreach ($obj_xml->routes->route as $route )
    4. {
    5.     print_r($route["routeName"]);
    6.     foreach ($route->Days->Day as $day )
    7.    {
    8.     print_r($day["dayOfWeeks"]);
    9.     }
    10.    
    11. }
    12. // Отдельно
    13. print_r($obj_xml->routes->route[0]->Days->Day[0]["dayOfWeeks"]);
     
    denis01 и trollik нравится это.
  6. trollik

    trollik Новичок

    С нами с:
    18 апр 2016
    Сообщения:
    13
    Симпатии:
    0
    Крайний вопрос, может дойдет: вывести все "часы" по "понедельнику" route=0. Саму строчку цикла, если можно.
     
  7. TimZ

    TimZ Новичок

    С нами с:
    2 сен 2016
    Сообщения:
    17
    Симпатии:
    9
    Код (Text):
    1. $obj_xml = new SimpleXMLElement($s);
    2. foreach ($obj_xml->routes->route as $route )
    3. {
    4.     print_r($route["routeName"]);
    5.     foreach ($route->Days->Day as $day )
    6.    {
    7.      if ($day["dayOfWeeks"]=="Понедельник") print_r($day["hours"]);
    8.  
    9.     }
    10.  
    11. }
     
    trollik и denis01 нравится это.
  8. trollik

    trollik Новичок

    С нами с:
    18 апр 2016
    Сообщения:
    13
    Симпатии:
    0
    Так спасибо огромное, потихоньку разобрался. А вот такая идея: есть 5 табов (сегодня, завтра, послезавтра и соотвествено пятница, суббота) Надо вывести в табы соответствующее время, причем сдвигать их в зависимости от дня недели (сегодня - вторник, завтра - среда и т.д. воскресенье не используется. Как бы их циклом (табы) выводить?
     
  9. TimZ

    TimZ Новичок

    С нами с:
    2 сен 2016
    Сообщения:
    17
    Симпатии:
    9
    Слишком много букв :) Задачу не совсем понял. Вывести время в таб, который совпадает по дню недели с уже имеющимся?
     
  10. trollik

    trollik Новичок

    С нами с:
    18 апр 2016
    Сообщения:
    13
    Симпатии:
    0
    Спасибо за отклик, справился. Нет есть табы с днями недели, причем первый по порядку, соответствуют текущему дню, задача была заменить первый второй и третий, на сегодня, завтра, послезавтра соответственно. Кстати о XML. Валидность файла имеет значение. Даже не совсем так. Например незакрытые теги, не считаются ошибкой, но парсить неудобно. Проблема в сгенерированом XML. В "понятный массив" проблема запихнуть. Без '@attribute'