Помощник
|
XML парсер |
Degradator
|
Сообщение
#1
|
||
|
|
||
|
|||
Den1xxx |
17.6.2014, 20:59;
Ответить: Den1xxx
Сообщение
#2
|
|
Ну так парсите по частям — я например при архивировании или скачивании больших файлов делал через while
Да вот например http://webi.ru/webi_articles/big_xml.html |
|
|
Degradator
|
Сообщение
#3
|
|
Да не блин, это не то. Тут надо пилить вроде в два раза больше кода чем есть. Надо что-то такое, где бы данные подгружались как тут, но при этом они шли во что-то такое
$xml = simplexml_load_string($xmlstring); $json = json_encode($xml); $array = json_decode($json,TRUE); хотя я может чего-то не понимаю |
|
|
Degradator
|
Сообщение
#4
|
|
Нашел решение вот тут http://php.net/xml_parse_into_struct
а именно вот эти две волшебные функции. [PHP]/*------------------------------------------------------------------*/ function xml_parse_into_array($xml) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESCRIPCION: Convierte un texto en xml codificado en ISO-8859-1 a un arreglo de php. --------------------------------------------------------------------*/ { $retorno = array(); $p = xml_parser_create(); xml_parser_set_option($p, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($p, $xml, $elementos, $llaves); xml_parser_free($p); $Qprocesados = 0; $retorno = xml_sub_parse_into_array($elementos, $Qprocesados); return array($retorno, $Qprocesados); } /*------------------------------------------------------------------*/ function xml_sub_parse_into_array($xml, &$i, $abierto = null) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESCRIPCION: --------------------------------------------------------------------*/ { $retorno = array(); //---------------------------------------- // Caso trivial: TAG COMPLETO //---------------------------------------- if ($xml[$i]['type'] == 'complete' && isset($xml[$i]['value'])) { $retorno[$xml[$i]['tag']] = trim($xml[$i]['value']); $i ++; return $retorno; //---------------------------------------- // Caso trivial: TAG COMPLETO //---------------------------------------- } else if ($xml[$i]['type'] == 'cdata' && isset($xml[$i]['value'])) { $retorno = trim($xml[$i]['value']); $i ++; return $retorno; //---------------------------------------- // Caso trivial: TAG VACIO //---------------------------------------- } else if ($xml[$i]['type'] == 'complete') { // $retorno = "<".$xml[$i]['tag']." />"; $retorno[$xml[$i]['tag']] = null; $i ++; return $retorno; //---------------------------------------- // Caso recursivo: TAG CON TAGS ADENTRO //---------------------------------------- } else if ($xml[$i]['type'] == 'open') { $abierto = $xml[$i]['tag']; $nivel = $xml[$i]['level']; if (!isset($retorno[$abierto])) $retorno[$abierto] = array(); if (isset($xml[$i]['value'])) { $retorno[$abierto][] = trim($xml[$i]['value']); } $i ++; $termino = false; while (!$termino && $i < count($xml)) { if ($xml[$i]['tag'] == $abierto && $xml[$i]['type'] == 'close' && $xml[$i]['level'] == $nivel ) { $termino = true; } else { $retorno[$abierto][] = xml_sub_parse_into_array($xml, $i, $abierto); if ($i < count($xml)) if ($xml[$i]['type'] == 'close') { $i ++; return $retorno; } } } return $retorno; } }[/PHP] Если бы я мог, нашел бы этого парня и *опу поцеловал бы его |
|
|
Den1xxx |
18.6.2014, 11:04;
Ответить: Den1xxx
Сообщение
#5
|
|
while (!$termino && $i < count($xml)) { if ($xml[$i]['tag'] == $abierto && $xml[$i]['type'] == 'close' && $xml[$i]['level'] == $nivel ) { $termino = true; } else { $retorno[$abierto][] = xml_sub_parse_into_array($xml, $i, $abierto); if ($i < count($xml)) if ($xml[$i]['type'] == 'close') { $i ++; return $retorno; } } } Дык об этом и речь — вот в этом коде парсится по частям через while, и сама функция вызывается рекурсивно. Просто я для этих целей уже редко ищу подобные классы — реализации чаще всего не подойдут на 80%, легче написать своё. |
|
|
Degradator
|
Сообщение
#6
|
|
Ну смотря как подходить к импорту. Я сделал так - разбираю файл в массив, который мне надо, и добавляю его в временную таблицу - что пришло то и добавляю один к одному. Именно для этого и нужен класс по работе с импортом. Остальное уже делается запросами на уровне sql в три запроса грубо говоря - добавить, обновить, удалить
Больше всего времени убил на парсинг файла, не хватало памяти. В результате считал его построчно, и сделал много маленьких файлов. |
|
|
bystar |
21.6.2014, 13:50;
Ответить: bystar
Сообщение
#7
|
|
|
Можно было попробовать уменьшить вес файла, напрмиер заменить названия тэгов, на: t1, t2 и т. д., атрибутов на a1, a2 и т. д. сохранить где то варианты преобразования может тогда парсер не ругался бы.
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
A-Parser 1.1 - продвинутый парсер ПС, кейвордов, контента, показателей, 70+ парсеров. | 354 | Forbidden | 279397 | 22.4.2024, 16:05 автор: AParser_Support |
|
Нужен сайт с автонаполнением по XML | 1 | REGNET | 1243 | 7.3.2024, 15:08 автор: REGNET |
|
Бесплатный парсер бот в Телеграм - [Parser Pro] | 5 | Parser_Pro | 3352 | 27.1.2024, 16:12 автор: Parser_Pro |
|
WebArchiveMaster - парсер Вебархива Добыча контента из ВебАрхива |
16 | footashes | 12315 | 23.11.2022, 16:36 автор: kuz999 |
|
⚡ AvitoSmart - быстрый парсер новых объявлений на Авито на запросах Представляю парсер для [b]Zennoposter[/b]'a или [b]Zennobox[/b] |
0 | akcium | 1270 | 19.11.2022, 13:05 автор: akcium |
Текстовая версия | Сейчас: 24.4.2024, 0:17 |