За последние 24 часа нас посетили 16748 программистов и 1694 робота. Сейчас ищут 853 программиста ...

Вопрос по SimpleXML

Тема в разделе "Прочие вопросы по PHP", создана пользователем g200, 28 янв 2014.

  1. g200

    g200 Новичок

    С нами с:
    16 дек 2013
    Сообщения:
    25
    Симпатии:
    0
    Подскажите почему скрипт не проходит по всем тэгам "length" в xml файле... Он выводит только первый и ошибку.

    XML-файл:

    Код (Text):
    1.  
    2. <?xml version="1.0" encoding="UTF-8" ?>
    3. <root>
    4. <catalogue>
    5. <FILM_1_NAME>
    6. <name>FILM_NAME</name>
    7. <packages>
    8. <_pack1>shared
    9. <includes>
    10. <cd>_cd_name_<length>60.0</length></cd>
    11. <cd>_cd_name_<length>80.0</length></cd>
    12. <book>_book_name_<length>0.0</length></book>
    13. </includes>
    14. </_pack1>
    15. <_pack2>shared
    16. <includes>
    17. <misc>_misc_name_<length>5.0</length></misc>
    18. <book>_book_name_<length>0.0</length></book>
    19. </includes>
    20. </_pack2>
    21. <_pack3>shared
    22. </_pack3>
    23. </packages>
    24. </FILM_1_NAME>
    25. <FILM_2_NAME>
    26. <name>FILM_NAME</name>
    27. <packages>
    28. <_pack1>shared
    29. </_pack1>
    30. <_pack2>shared
    31. <cd>_cd_name_<length>30.0</length></cd>
    32. </_pack2>
    33. </packages>
    34. </FILM_2_NAME>
    35. </catalogue>
    36. </root>
    Скрипт обработки:

    Код (Text):
    1.  
    2. <?php
    3.  
    4. $xml=simplexml_load_file("cat.xml");
    5.  
    6. $cat_array=array();
    7.  
    8. for($y=0,$i=0;$y<($xml->catalogue->children()[0]->packages->children()[$y]->includes->cd->count()),$i<($xml->catalogue->children()[0]->packages->children()->count());$y++,$i++) {
    9.  
    10. if(!empty($xml->catalogue->children()[0]->packages->children()[$i]->includes->cd[$y])) {
    11.  
    12. $cat_array[$y]=$xml->catalogue->children()[0]->packages->children()[$i]->includes->cd[$y]->length;
    13.  
    14. }
    15.  
    16. echo $cat_array[$y]."<br />"."y: ".$y."<br />"." x: ".$i;
    17. }
    18. ?>
    Результат:

    60.0
    y: 0
    x: 0
    Notice: Undefined offset: 1 in C:\localweb\index.php on line 15

    y: 1
    x: 1
    Fatal error: Call to a member function count() on a non-object in C:\localweb\index.php on line 7
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  3. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Вывести содержимое всех тегов length можно так:
    Код (PHP):
    1. $xml=simplexml_load_file("cat.xml");
    2. function recurse_run($parent){
    3.     foreach($parent->children() as $el){
    4.         if($el->getName() == 'length'){
    5.             echo $el, '<br/>';
    6.         }
    7.         recurse_run($el);
    8.     }
    9. }
    10. recurse_run($xml->catalogue); 
     
  4. g200

    g200 Новичок

    С нами с:
    16 дек 2013
    Сообщения:
    25
    Симпатии:
    0
    Большое спасибо, щас испробую!
     
  5. g200

    g200 Новичок

    С нами с:
    16 дек 2013
    Сообщения:
    25
    Симпатии:
    0
    Все работает пока известна структура xml файла. А как можно изменить написанное вами, чтобы обрабатывался такой файл:

    Код (Text):
    1.  
    2. <root>
    3. <item1>value1</item1>
    4. <item2>value2</item2>
    5. <item3>value3 <item4>value4</item4></item3>
    6. <item5>value5 <item6>value6 <item7>value7</item7></item6></item5>
    7. </root>
    Причем, неизвестно какое кол-во, какое название и какая вложенность у тэгов item... Весь вечер бьюсь ерунда выходит
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Нужно было вывести все теги <length>
    Не верю.
    Код (PHP):
    1. <?php
    2. $xml=simplexml_load_file('cat2.xml');
    3. function recurse_run($parent){
    4.     foreach($parent->children() as $el){
    5.         echo $el, '<br/>';
    6.         recurse_run($el);
    7.     }
    8. }
    9. recurse_run($xml);
     
  7. g200

    g200 Новичок

    С нами с:
    16 дек 2013
    Сообщения:
    25
    Симпатии:
    0
    Ха) а я через for делал и проверял на empty )) спасибо, прояснилось. Респект тебе чувак