За последние 24 часа нас посетили 17839 программистов и 1612 роботов. Сейчас ищут 1358 программистов ...

XML parser пропускает аттрибут

Тема в разделе "PHP для новичков", создана пользователем running-frag, 31 июл 2012.

  1. running-frag

    running-frag Активный пользователь

    С нами с:
    4 сен 2008
    Сообщения:
    65
    Симпатии:
    0
    Доброго времени суток. Есть рабочий в общем то парсер на основе simple_xml но в нём есть косяк. При определённых условиях, а именно
    Код (Text):
    1. ...<row messageID="313909926">this is text<font size="12...
    он пропускает значение messageID и выводит [row][0] = "this is text...", если не убирать (как сейчас в скрипте) CDATA тогда у нас будет [row][messageID]="313909926".

    Собственно вопрос, как сделать что б показывало сразу и текст и messageID в одном массиве т.е.
    Код (Text):
    1. [row][0]=...
    2. [row][messageID]=...
    Код (Text):
    1.     function xmlGetDataByUrlRaw ($_url)
    2.     {
    3.         $xmlAsStr = file_get_contents ($_url);
    4.         $xmlAsStr = preg_replace_callback ('/<!\[CDATA\[(.*)\]\]>/', create_function (
    5.                         '$_matches', 'return trim (htmlspecialchars ($_matches[1]));'), $xmlAsStr);
    6.         $xmlAsObj = simplexml_load_string ($xmlAsStr);
    7.         $xmlAsArr = $this->xmlGetAsArray ($xmlAsObj);
    8.         return $xmlAsArr;
    9.     }
    Код (Text):
    1.  
    2.     function xmlGetAsArray ($_xmlData)
    3.     {
    4.         $return = FALSE;
    5.  
    6.         if (is_object ($_xmlData))           // если обьект переделываем в массив
    7.             $_xmlData = get_object_vars ($_xmlData);
    8.  
    9.         if (is_array ($_xmlData))
    10.             foreach ($_xmlData as $index => $value)
    11.             {
    12.                 if (is_object ($value))     // если обьект
    13.                 {
    14.                     $return[$index] = $this->xmlGetAsArray ($value);
    15.                     continue;
    16.                 }
    17.  
    18.                 if (is_array ($value))      // если массив
    19.                 {
    20.                     if ($index == "@attributes")
    21.                         foreach ($value as $attrIndex => $attrValue)
    22.                         {
    23.                             $return[$attrIndex] = $attrValue;
    24.                         }
    25.                     else
    26.                         $return[$index] = $this->xmlGetAsArray ($value);
    27.                 }
    28.                 else                        // если обычная запись
    29.                     $return[$index] = $value;
    30.             }
    31.  
    32.         return $return;
    33.     }