За последние 24 часа нас посетили 87997 программистов и 5591 робот. Сейчас ищут 2183 программиста ...

Парсинг XMLReader(), циклы

Тема в разделе "PHP для новичков", создана пользователем Petar07, 13 янв 2017.

  1. Petar07

    Petar07 Новичок

    С нами с:
    13 янв 2017
    Сообщения:
    1
    Симпатии:
    0
    Ребята, путаюсь во вложенности тегов. нужно получить информацию следующим образом id, name, pmboxtype, делать пытаюсь след. образом
    PHP:
    1. while ($reader->read()) {
    2.         if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'PMActivity')) {
    3.             $xmlarr = array();
    4.             // считываем атрибуты
    5.             $xmlarr['id'] = $reader->getAttribute('id');
    6.             $xmlarr['name'] = $reader->getAttribute('Name');
    7.             var_dump($xmlarr['id'], $xmlarr['name']);
    8.                 while ($reader->read()) {
    9.                     if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'PMActivityProps')) {
    10.                         while ($reader->read()) {
    11.                             if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'PMBoxType')) {
    12.                                 while ($reader->read()) {
    13.                                     if ($reader->nodeType == XMLReader::TEXT) {
    14.                                         $xmlarr[$reader->localName] = $reader->value;
    15.                                         var_dump ($xmlarr[$reader->localName] = $reader->value);
    16.                                         echo '<br>';
    17.                                        
    18.                                     }
    19.                                    
    20.                                     elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->localName == 'PMBoxType')) {
    21.                                         break;
    22.                                     }
    23.                                 }        
    24.                             }
    25.                         }
    26.                     }
    27.                
    28.                 }
    29.             }
    30.             elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->localName == 'PMActivityProps')) {
    31.                 break;
    32.             }
    33.  
    34.         }
    информация получаю такую что одна строка получается как надо, а далее только pmboxtype, понимаю что с циклами проблема, а разобраться не получается
     

    Вложения:

    • 877.JPG
      877.JPG
      Размер файла:
      78,7 КБ
      Просмотров:
      3
  2. c8lkid

    c8lkid Новичок

    С нами с:
    24 ноя 2016
    Сообщения:
    6
    Симпатии:
    1
    Основные ошибки следующие:
    1. Нет условия выхода из внутреннего цикла.
    2. Значения массива будут перезаписываться, после выхода из циклов он будет содержать только последние значения.

    В вашем случае можно сделать примерно так, хотя безусловно существуют лучшие варианты:)
    PHP:
    1. $ids = $names = $box_types = [];
    2.  
    3. while($z->read()) {
    4.     while($z->read() && $z->name !== 'PMActivity') {};
    5.     array_push($ids, $z->getAttribute('id'));
    6.     array_push($names, $z->getAttribute('name'));
    7.     while($z->read() && $z->name !== 'PMActivityProps') {};
    8.     while($z->read() && $z->name !== 'PMBoxType') {};
    9.     while($z->read() && $z->nodeType !== XMLReader::TEXT) {};
    10.     array_push($box_types, $z->value);
    11. }