Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Парсинг XML для начинающиго


Автор: Areostar 2.7.2013, 12:58
в первый раз понадобилось парсить большой файл(к тому же не совсем правильно составленный)
 
Код

    $str = file_get_contents("http://www.site.ru/editXML/scripts/t6.xml");
    $xml = new SimpleXMLElement($str);


так вот я получаю всё содержимое файла

но теперь как мне  теперь аккуратно перебрать каждый узел заходя во внутрь до последнего уровня вложенности?

тем более мне надо каждый раз проверять в каком теге я нахожусь(они разные, говорил же не правельно соствален smile ).

если возможно проиллюстрируйте поджалуйста!! smile 

Автор: Sanchezzz 2.7.2013, 13:30
SimpleXMLElement не верный инструмент для большого размера так как копирует весь файл в оперативу тем самым может произойти крах нехватки памяти, выделяемое подскрипт, конкретно найти, что то можно например через xpath

Используйте XMLReader этот монстр читает любой размер XML файлов поэтапно , последний раз что я им парсил была XML50мб выгрузки 1С и, видео каталог с megogo.net обьемом в 20мб. SimpleXMLElement  умер в обработке.

Документация по XMLReader  есть на сайте php.net с примерами.

мой стандартный багаж при парсинге xml

Код

function xml2assoc(&$xml){ 
    $assoc = NULL; 
    $n = 0; 
    while($xml->read()){ 
        if($xml->nodeType == XMLReader::END_ELEMENT) break; 
        if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){ 
            $assoc[$n]['name'] = $xml->name; 
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value; 
            $assoc[$n]['val'] = xml2assoc($xml); 
            
            $n++; 
        }else if($xml->nodeType == XMLReader::CDATA){
            $assoc[$n] = $xml->value; 
            
        } 
        else if($xml->isEmptyElement){ 
            $assoc[$n]['name'] = $xml->name; 
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value; 
            $assoc[$n]['val'] = ""; 
            $n++;
    
        }
        
        else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value; 
    } 
    return $assoc; 


// ----- Парсинг 

$file = 'objects.xml';
$reader = new XMLReader();
$reader->open($file);
$reader->read(); // сдвиг внутрь секции 
$reader->read(); // продвигаемся еще глубже
$data  = xml2assoc( $reader ); // получаем содержимое 

$i=0;
foreach($data as $item){
    pre($item); // показываем массив в print_r
    $i++;
    if($i==50) break(1);
}



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)