Проблема кодировки при парсинге xml наверное встречалась не только мне. Дело в том что используя xml_parser_create() и xml Windows-1251 при выводе данных получается вот какая штука: Если текст начинается с руского символа все нормально, но если первый символ не русский теряется все что находится до первого вхождения русского символа. Например: текст мой мейл blabla@blabla.com пишите сюда будет выводиться нормально, а если blabla@blabla.com это мой мейл пишите сюда выводится как это мой мейл пишите сюда. Вот как я решил эту проблему: PHP: // Функция для преоброзования русских символов в код function cyrcode($s){ for($i=0, $m=strlen($s); $i< $m; $i++){ $c=ord($s[$i]); if ($c< =127){ $t.=chr($c); continue; } if ($c >=128 && $c< =255){ $t.="#".$c; continue; } } return $t; } // Функция обратного преоброзования кода в русские символы function cyrchr($s){ $col=substr_count($s,"#"); for ($i=0; $i< $col; $i++) $s=substr_replace ($s, chr(substr($s,strpos($s,"#")+1,3)), strpos($s,"#"),4); $t=$s; return $t; } $xml_parser = xml_parser_create (); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE); xml_set_element_handler($xml_parser, "startElement", "endElement"); // Здесь собственно можно использовать функцию cyrchr xml_set_character_data_handler($xml_parser, "stringElement"); if (!($fp = fopen($file, "r"))) {die("could not open XML input");} while ($data = fgets($fp)) { $data=cyrcode($data); if (!xml_parse($xml_parser, $data, feof($fp))) { echo "< br >XML Error: ".xml_error_string(xml_get_error_code($xml_parser))." at line ".xml_get_current_line_number($xml_parser); break; } } Если код ужасный, не ругайтесь, а помогите написать хороший. А то средства системные жрет сильно, особенно ощушается если xml больше 10MB
ISO-8859-1 (по умолчанию) А вы укажите кодировку желаемую, вот так попробуйте: .... $xml_parser = xml_parser_create ( 'US-ASCII' ); ....
ну там всеголишь поддерживается три кодировки US-ASCII, UTF-8 и ISO-8859-1. Я незнаю честно говоря что такое US-ASCII, но это точно не win1251. Помоему US это чтото типа United States. В любом случае я так пробовал. Ваще у меня такое ощущение что xml_parser_createу глубоко наплевать что там у него прописано. он никак не реагирует на эти настройки. Может надо изменять кодировку XML?
Я пробовал и simplexml, но (помоему он отказался работать изза слишком большого файла xml). У меня каталог товаров, в котором находится болле 100 000 товаров. Короче xml весит более 145MB. Почемуто simplexml я отбросил сразу. Можно конечно кусками грузить, но не думаю что в конечном итоге я буду экономить на памяти.
sahaba Советую тебе проиндексировать его, и работая уже как с бинарной структурой, считывая срез нужных данных по байтам.
помоему это будет не меньше памяти жрать. XML ку я беру с другого хоста, раз в неделю. Чтобы его сделать бинарным, полюбому мне надо закачать его к себе на хост, потом уже поработать с ним. А это уже 145МБ входящего трафика, на что хостер мой ругается. Вот если закачивать себе этот файл кусками и собрать потом его.... ну незнаю... На cron чтоли посадить весь проццес??? ... Но так тоже не валидно. XML может измениться в любой момент...
sahaba проиндексировать, это значит прогнать и хранить в памяти или ещё где отдельно индексы каждого ключа, а файл обрабатывать кусками, с индекса начинаешь считывать определённое количество байт, до следующего индекса, обрабатываешь и дальше пошёл.
А чем тебе ненравится? я имею ввиду он тоже кусками (построчно) читает файл, обрабатывает эту строку потом идет на следующую. Мне интересно что с бинарной системой делать? как понять бинарный, насколько я помню это сжатие данных типа рар зип Если это так, как мне с ним работать с удаенного комутера :?:
r00les Чето я торможу. если я не сжимаю исходный файл, с чембы я не работал мне все равно надо весь файл обрабатывать. Если я многократно обращалсябы к разным данным можно былобы, а в моем случае, я просто прохожусь по всему файлу и вношу все данные в базу. Какой смысл брать исходный файл делить его на куски ... а потом все обратно. По твоему это скоростнее будет? Если я реально торможу прошу скинуть ссылку где я могу подробнее прочитать об этом.
sahaba забей. Тебе сейчас насоветуют. Простейший случай индексации xml файла это создание таблицы смещений токенов относительно начала файла и их размеров. Тогда при поиске токена (ноды) ты будешь искать его ключ в таблице, брать оттуда смещение и длину токена и читать сразу нужный кусок файла. На больших XML сэкономить ресурсы не получиться (во всяком случае пока не сделают аппаратную поддержку xml в процессорах как обещают). Максимум что ты можешь сделать это разбить свой парсинг на этапы, но в этом случае тебе придется весь парсинг реализовывать ручками поскольку большинство инструментов толкает все сразу в память для ускорения обработки. Но сэкономив память ты проиграешь в скорости обработки и потраченных ресурсах процессора. Может ты озвучишь первоначальную задачу, которая побудила тебя парсить его?
Создал каталог ("партнерка интернет магазина"). Они постоянно обновляют свой XML, а я в неделю 1 раз беру у них новый файл.
Понятно. XML сильно сложной структуры? Пробежись обычным fread и найди начало и конец минимальных полных блоков информации нужной тебе пример блока: HTML: <item> <name></name> <count></count> <description></description> </item> Запиши смещение начала каждого такого блока и его длину в промежуточный файл. Потом в цикле берешь эту информацию, читаешь свой XML поблочно и парсишь уже эти конкретные блоки. Затем обрабатывай как тебе нужно. И только после этого парсишь следующий блок. Памяти будет кушать существенно меньше.
Simpliest БЛЯДЬ ! а я про что говорил, ну конечно не так гениальноумно как ты мистер умник. Но то же самое. БЛЯДЬ !