X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> XML парсер
Degradator
Degradator
Topic Starter сообщение 17.6.2014, 19:35; Ответить: Degradator
Сообщение #1


День добрый. Есть у кого нибудь какой-то модный класс, при помощи которого можно было бы взять и распарсить файл xml размером 274 мегабайта в ассоциативный массив не словив при этом memory max size limit?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 17.6.2014, 20:59; Ответить: Den1xxx
Сообщение #2


Ну так парсите по частям — я например при архивировании или скачивании больших файлов делал через while
Да вот например http://webi.ru/webi_articles/big_xml.html
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Degradator
Degradator
Topic Starter сообщение 18.6.2014, 9:00; Ответить: Degradator
Сообщение #3


Да не блин, это не то. Тут надо пилить вроде в два раза больше кода чем есть. Надо что-то такое, где бы данные подгружались как тут, но при этом они шли во что-то такое
$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

хотя я может чего-то не понимаю
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Degradator
Degradator
Topic Starter сообщение 18.6.2014, 10:35; Ответить: 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
Den1xxx
сообщение 18.6.2014, 11:04; Ответить: Den1xxx
Сообщение #5


(Degradator @ 18.6.2014, 13:35) *
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
Degradator
Topic Starter сообщение 20.6.2014, 16:48; Ответить: Degradator
Сообщение #6


Ну смотря как подходить к импорту. Я сделал так - разбираю файл в массив, который мне надо, и добавляю его в временную таблицу - что пришло то и добавляю один к одному. Именно для этого и нужен класс по работе с импортом. Остальное уже делается запросами на уровне sql в три запроса грубо говоря - добавить, обновить, удалить

Больше всего времени убил на парсинг файла, не хватало памяти. В результате считал его построчно, и сделал много маленьких файлов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
bystar
bystar
сообщение 21.6.2014, 13:50; Ответить: bystar
Сообщение #7


Можно было попробовать уменьшить вес файла, напрмиер заменить названия тэгов, на: t1, t2 и т. д., атрибутов на a1, a2 и т. д. сохранить где то варианты преобразования может тогда парсер не ругался бы.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыA-Parser 1.1 - продвинутый парсер ПС, кейвордов, контента, показателей, 70+ парсеров.
354 Forbidden 279380 Вчера, 16:05
автор: AParser_Support
Открытая тема (нет новых ответов) Нужен сайт с автонаполнением по XML
1 REGNET 1242 7.3.2024, 15:08
автор: REGNET
Открытая тема (нет новых ответов) Бесплатный парсер бот в Телеграм - [Parser Pro]
5 Parser_Pro 3352 27.1.2024, 16:12
автор: Parser_Pro
Открытая тема (нет новых ответов) WebArchiveMaster - парсер Вебархива
Добыча контента из ВебАрхива
16 footashes 12314 23.11.2022, 16:36
автор: kuz999
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлы⚡ AvitoSmart - быстрый парсер новых объявлений на Авито на запросах
Представляю парсер для [b]Zennoposter[/b]'a или [b]Zennobox[/b]
0 akcium 1269 19.11.2022, 13:05
автор: akcium


 



RSS Текстовая версия Сейчас: 23.4.2024, 14:50
Дизайн