@ImPuuLsE

Как распарсить XML файл в массив?

Здравствуйте, имеется такого вида xml:
<bus>
 <directions>
  <direct>
   <table>
    <tr>
     <td>Остановочные пункты</td>
     <td>Время отправления</td>
    </tr>
    <tr>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
     <td>пвсчпсв</td>
    </tr>
    <tr></tr>
    <tr></tr>
    <tr></tr>
    <tr></tr> и т. д.
   </table>
<table></table> и т. д.
</direct>
<return>
Такого же формата как и direct
</return>
 </directions>
</bus>

Что то не получается с XMLReader() выходит не полный массив=(
$xmlReader = new \XMLReader();
        $xmlReader->open($xml);
        $buses = array();
        while ($xmlReader->read()) {
            switch ($xmlReader->nodeType) {
                case ($xmlReader::ELEMENT):
                    // если находим в xml элемент <bus> начинаем обрабатывать его
                    if ($xmlReader->localName == 'bus') {
                        // мы будем формировать массив который будет содержать все дочерние элементы элемента <bus>
                        while ($xmlReader->read()){
                            if ($xmlReader->nodeType == $xmlReader::ELEMENT) {
                                $name = $xmlReader->localName;
                                $xmlReader->read();
                                $bus[$name] = $xmlReader->value;
                            }
                            if ($xmlReader->nodeType == $xmlReader::END_ELEMENT && $xmlReader->localName == 'bus')
                                break;
                        }
                        $buses[]=$bus;
                    }
            }
        }
        return $buses;

вот ссылка на xml - dropmefiles.com/7pKYG
  • Вопрос задан
  • 2423 просмотра
Пригласить эксперта
Ответы на вопрос 2
windoctor
@windoctor
Используйте SimpleXML
Ответ написан
Комментировать
@Panda_Tamara
Разработчик проектов под UMI.CMS
Ловите велосипед. Для вызова передаете объект XMLReader и ноду для начала парсинга. Возвращается ассоциативный массив, причем если на одном уровне будет несколько одинаковых нод, он вернет их подмассивом с числовыми индексами.

public function xmlReader2assoc($xml, $name) {
        $tree = null;

        while ($xml->read()) {
            if ($xml->nodeType == XMLReader::END_ELEMENT) {
                return $tree;
            } else if ($xml->nodeType == XMLReader::ELEMENT) {
                if ((!$xml->isEmptyElement)) {
                    $childs = $this->xmlReader2assoc($xml, $xml->localName);

                    if (count($childs) > 1) {
                        if (isset($tree[$xml->localName])) {
                            if (!isset($tree[$xml->localName][0])) {
                                $moved = $tree[$xml->localName];
                                unset($tree[$xml->localName]);
                                $tree[$xml->localName][0] = $moved;
                            }
                            $tree[$xml->localName][] = $childs;
                        } else {
                            $tree[$xml->localName] = $childs;
                        }
                    } else {
                        $tree[$xml->localName] = $childs;
                    }
                }
            } else if ($xml->nodeType == XMLReader::TEXT) {
                $tree = $xml->value;
            }
        }
        return $tree;
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы