Преобразование данных XML в массив PHP - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть этот XML-файл: http://www.basket.ba/ksbih/xml/200_07.xml

Я использовал все основные функции и классы для преобразования XML в массив и, похоже, не смог заставить его работать должным образом.

Некоторые элементы отсутствовали в выходных данных, когда "print_r / var_dump-ing" их.

Во-первых, я думал, что в файле была синтаксическая ошибка, однако это не былодело.

Мне нужно преобразование супер-dooper xml2array.Одна вещь может быть полезна:

Если есть сценарий / класс / функция преобразования super-dooper simplexml2array, это может помочь еще лучше, так как я уменьшу свой текущий код таким образом,

1 Ответ

1 голос
/ 05 декабря 2011

почему вы не используете какой-либо класс вне Интернета?

<?php
class xml2array {

    function xml2array($xml) {
        if (is_string($xml)) {
            $this->dom = new DOMDocument;
            $this->dom->loadXml($xml);
        }

        return false;
    }

    function _process($node) { 
        $occurance = array();

        foreach($node->childNodes as $child) {
            $occurance[$child->nodeName]++;
        }

        if($node->nodeType == XML_TEXT_NODE) { 
            $result = html_entity_decode(htmlentities($node->nodeValue, ENT_COMPAT, 'UTF-8'), 
                                     ENT_COMPAT,'ISO-8859-15');
        } 
        else {
            if($node->hasChildNodes()){
                $children = $node->childNodes;

                for($i=0; $i<$children->length; $i++) {
                    $child = $children->item($i);

                    if($child->nodeName != '#text') {
                        if($occurance[$child->nodeName] > 1) {
                            $result[$child->nodeName][] = $this->_process($child);
                        }
                        else {
                            $result[$child->nodeName] = $this->_process($child);
                        }
                    }
                    else if ($child->nodeName == '#text') {
                        $text = $this->_process($child);

                        if (trim($text) != '') {
                            $result[$child->nodeName] = $this->_process($child);
                        }
                    }
                }
            } 

            if($node->hasAttributes()) { 
                $attributes = $node->attributes;

                if(!is_null($attributes)) {
                    foreach ($attributes as $key => $attr) {
                        $result["@".$attr->name] = $attr->value;
                    }
                }
            }
        }

        return $result;
    }

    function getResult() {
        return $this->_process($this->dom);
    }
}
...