Помогите написать парсер для xml файла которий должен все заносить в базу даних mysql
структура хмл, перелопатил кучу всего самому не получаетса написать, помогите или дайте напрям куда копать.
Octik: Всё зависит от условий. Если это единоразовая задача - можно просто вставить в комп побольше оперативки и загрузить всё разом в память.
Если же есть ограничение по ресурсам, то имеет смысл посмотреть в сторону потокового чтения и обработки файла. Если мне не изменяет память, это может делать XMLReader.
и подскажи как потом ето все дело закинуть в mysql
Точно так же как и любую другую информацию делая запросы.
суть така даний хмл герерируєт 1с раз в час и закидивает на хостинг мне надо чтоб бил парсер которий будет заливать все в базу каждий час (тойсть файл обновилса запустилса скрипт обновил дание в бд
)
Octik: Тогда вам нужно учитывая размеры файла и специфику работы парсера написать скрипт, который будет работать по CRON. Большинство хостингов поддерживают добавление задач в CRON. Так что вводные данные особо никак не меняются: поточный парсинг (хостинг не даст вам съесть десяток гигабайт памяти) в цикле обработки элементов нужная вам логика для получения, обновления и вставки данных в БД.
Алексей Скобкин: Кстати, замечу, что ваш XML, скорее всего, имеет не очень удачную схему. Впрочем вам, вероятно, с этим ничего не поделать - придётся городить больше условий - ничего особо сложного.
Алексей Скобкин: смотри нашол вот такой кусок кода помоги мне его переделать под мой хмл <?
function webi_xml($file)
{
global $webi_depth; // счетчик, для отслеживания глубины вложенности
$webi_depth = 0;
global $webi_tag_open; // будет содержать массив открытых в данный момент тегов
$webi_tag_open= array();
global $webi_data_temp; // этот массив будет содержать данные одного тега
####################################################
### функция работы с данными
function data ($parser, $data)
{
global $webi_depth;
global $webi_tag_open;
global $webi_data_temp;
// добавляем данные в массив с указанием вложенности и открытого в данный момент тега
$webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]['data'].=$data;
}
############################################
####################################################
### функция открывающих тегов
function startElement($parser, $name, $attrs)
{
global $webi_depth;
global $webi_tag_open;
global $webi_data_temp;
// если уровень вложенности уже не нулевой, значит один тег уже открыт
// и данные из него уже в массиве, можно их обработать
if ($webi_depth)
{
// здесь начинается обработка данных, например добаление в базу, сохранение в файл и т.д.
// $webi_tag_open содержит цепочку открытых тегов по уровню вложенности
// например $webi_tag_open[$webi_depth] содержит название открытого тега чья информация сейчас обрабатывается
// $webi_depth уровень вложенности тега
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]['attrs'] массив атрибутов тега
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]['data'] данные тега
// после обработки данных удаляем их для освобождения памяти
unset($GLOBALS['webi_data_temp'][$webi_depth]);
}
// теперь пошло открытие следующего тега и дальше обработка его произойдет на следующем шаге
$webi_depth++; // увеличиваем вложенность
$webi_tag_open[$webi_depth]=$name; // добавляем открытый тег в массив информаци
$webi_data_temp[$webi_depth][$name]['attrs']=$attrs; // теперь добавляем атрибуты тега
}
###############################################
#################################################
## функция закрывающих тегов
function endElement($parser, $name) {
global $webi_depth;
global $webi_tag_open;
global $webi_data_temp;
// здесь начинается обработка данных, например добаление в базу, сохранение в файл и т.д.
// $webi_tag_open содержит цепочку открытых тегов по уровню вложенности
// например $webi_tag_open[$webi_depth] содержит название открытого тега чья информация сейчас обрабатывается
// $webi_depth уровень вложенности тега
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]['attrs'] массив атрибутов тега
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]['data'] данные тега
unset($GLOBALS['webi_data_temp']); // после обработки данных удаляем массив с данными целиком, так как произошло закрытие тега
unset($GLOBALS['webi_tag_open'][$webi_depth]); // удаляем информацию об этом открытом теге... так как он закрылся
// указываем какие функции будут работать при открытии и закрытии тегов
xml_set_element_handler($xml_parser, "startElement", "endElement");
// указываем функцию для работы с данными
xml_set_character_data_handler($xml_parser,"data");
// открываем файл
$fp = fopen($file, "r");
$perviy_vxod=1; // флаг для проверки первого входа в файл
$data=""; // сюда собираем частями данные из файла и отправляем в разборщик xml
// цикл пока не найден конец файла
while (!feof ($fp) and $fp)
{
$simvol = fgetc($fp); // читаем один символ из файла
$data.=$simvol; // добавляем этот символ к данным для отправки
// если символ не завершающий тег, то вернемся к началу цикла и добавим еще один символ к данным, и так до тех пор, пока не будет найден закрывающий тег
if($simvol!='>') { continue;}
// если закрывающий тег был найден, теперь отправим эти собранные данные в обработку
// проверяем, если это первый вход в файл, то удалим все, что находится до тега <?
// так как иногда может встретиться мусор до начала XML (корявые редакторы, либо файл получен скриптом с другого сервера)
if($perviy_vxod) {$data=strstr($data, '<?'); $perviy_vxod=0;}
// теперь кидаем данные в разборщик xml
if (!xml_parse($xml_parser, $data, feof($fp))) {
// здесь можно обработать и получить ошибки на валидность...
// как только встретится ошибка, разбор прекращается
echo " XML Error: ".xml_error_string(xml_get_error_code($xml_parser));
echo " at line ".xml_get_current_line_number($xml_parser);
break;
}
// после разбора скидываем собранные данные для следующего шага цикла.
$data="";
}
fclose($fp);
xml_parser_free($xml_parser);
// удаление глобальных переменных
unset($GLOBALS['webi_depth']);
unset($GLOBALS['webi_tag_open']);
unset($GLOBALS['webi_data_temp']);
}
webi_xml('1.xml');
я никак не пойму как получить дание с парсера и занести их в базу можеш написать пример запроса?
Octik: Не помогу. Тостер - это не бесплатные работники на час, а сервис вопросов и ответов. Давайте вы почитаете документацию, на которую я дал вам ссылки, попробуете написать код и, если у вас не получится - вернётесь и чётко изложите ошибки, которые у вас возникли.