День добрый. Столкнулся с проблемой такого вида: есть xml-пакеты вида <TAG param1="1" param2="2" qweqwe="123"/> нада сделать из них базу данных, по которой можно будет выборку делать, мол: ВЫБРАТЬ всё ГДЕ param1 > 1 И param1 < 100; к примеру. ручками вбивать все поля xml-пакета не предоставляеться возможным. помогите решить проблему Спасибо!
andrvm а по подробнее можно? читаю сейчас вот это: http://dev.mysql.com/doc/refman/6.0/en/ ... tions.html, но не уверен, что на моём хостинге стоит MySQL 5.1.5+ ;(
andrvm а, не, мне ненужен парсер xml))))))) я итак парсю его =) мне нада придумать, как хранить эти данные) начинаю понимать, что нет смысла перегонять в MySQL, придёться другой способ юзать какой то
ast Довольно стандартная задача. И тут два варианта: 1. Хранить данные в XML, и пользоваться XQuery для выборки данных (andrvm имел ввиду именно XQuery говоря про XPath). 2. Преобразовать XML в таблицу/таблицы базы данных и использовать SQL для их выборки. Недостатки первого варианта: 1. XQuery годится только для простых выборок. 2. Скорость меньше на 2 порядка, т.е. в сотни раз. Если данных немного (файл XML меньше 10 МБ, это не особо заметно). При более-менее сложных запросах скорость падает еще на несколько порядков. Исходя из личного опыта я могу сказать, что XML+XQuery стоит применять если данные при каждом запросе получаются откуда-то в виде XML или они они используются не слишком часто. В остальных случаях лучше использовать БД. Любимый сайт для изучения технологий, связанных с XML: w3schools.com Потратьте время, изучите XPath, XQuery - очень поможет при импорте XML. Видимо, XML в последующие 10 лет будет стандартом де-факто для обмена данными. Приведите структуру данных исходного XML: разберемся что куда ;-)
AlexGousev HTML: <O OD="30" cost="339" get_day="1176464052" id="27046758351.1" made="League Tech" massa="450" max_count="5" min="sk8=20,intel=10,pro^12" name="b5-m3" nskill="7" owner="Mult_One" p1="2" p2="1" put_day="1172576052" range="7" section="0" shot="9-10" st="G,H" tm="1172494839" txt="Laser Turret" type="807.22"/> <O OD="30" cost="339" get_day="1176464052" id="27047698797.1" made="League Tech" massa="450" max_count="5" min="sk8=20,intel=10,pro^12" name="b5-m3" nskill="7" owner="Mult_One" p1="2" p2="1" put_day="1172576052" range="7" section="0" shot="9-10" st="G,H" tm="1172496339" txt="Laser Turret" type="807.22"/> <O cost="30" count="2" get_day="1176809804" id="22326881767.1" massa="1" name="b6-z23" owner="Manve" p1="2" p2="1" put_day="1171625804" section="0" txt="Wandflower" type="805.1"/> <O cost="33" count="5" get_day="1177230446" id="22326881792.1" massa="1" name="b6-z23" owner="Manve" p1="2" p2="1" put_day="1172046446" section="0" txt="Wandflower" type="805.1"/> дело в том, что данные для запроса обновляюца каждые 15 минут, с сервера, приходят в виде XML. XQuery говорите? хорошо. Обязательно почитаю, есть мнение, что это то, что мне нужно. файлы меньше 10МБ. а вот запросы от разных пользователей могут идти довольно часто (гдето раз в минуту, для того, что делаю - это часто )
Если это все, то тут и XQuery не нужен PHP: <?php $xmlstr = file_get_contents('http://example.com/export.xml'); $xml = new DOMDocument(); $xml->loadXML($xmlstr); foreach ($xml->firstChild->childNodes as $child) mysql_query('insert into table set od="'.$child->getAttribute('OD').'", get_day="'.$child->getAttribute('get_day').'"'); ?>
AlexGousev ну, я так же делал тока в том то и дело, что мне поля для каждого параметра прописывать нет возможности. о том и речь, в том и проблема...... мне нада хранить данные, зная только названия полей, но не их количество к примеру...... там есть ~20 типов пакетов с совершенно разными параметрами
AlexGousev я имею дело не совсем с чистым XML. а тока с тегами и параметрами внутри него... т.к. сказать... это, по сути дела, магазин. допустим, выбираю я пункт "вещи", и мне приходят <O ... /> для вещей, выбераю "медицина", и приходят <O ... />, но уже с параметрами медицинскими... причем их очень много, чтобы заранее под каждое сделать поле в MySQL. так что нада придумывать альтернативный способ использования. к примеру, можно сохранить тоо, что шлёт сервак, в файлах(обновление файлов каждые 15 минуь ), а потом эти файлы использовать как БД для выдачи данных по запросам (в том числе выборка вида "от и до")
Можно сделать это динамически. Точно также можно создать несколько таблиц, вместо файлов, и загнать туда данные. Можно было бы сделать одну большую таблицу, в которую загнать основные данные, и одну вспомогательную, в которой хранить остальное. Но такой подход имеет смысл, если хотя бы 2/3 данных в разных xml совпадает (по смыслу). Ну и в обеих вариантах имеет смысл отдать одну таблицу под хранение соответствия xml-файла названию таблицы.
RomanBush как раз динамически это сделать и не получиться ;( про создание таблицы под данные - сразу говорю, НЕТ) тут НЕ(!) подойдёт вариант с вбиванием полей параметров ручками. что-то другое надо явно
это годится только для очень малых объемов, он все кладет в память. я использую xml_parse ast запрос к серверу идет по крону? надо парсить и хранить в базе. структура дополнительных полей: create table f_param fp_id int fp_name varchar create table f_value fv_id int fv_fp_id int fv_obj_id int fv_type tinyint #0,1 - int или str fv_value tinytext fv_intvalue int # чтобы было индексированное поля
И это хорошо, что в память: можно работать с документом, а не просто парсить его куда-то. Ну а 100-мегабайтные файлы мало кто юзает… ast А все-таки какого типа выборки делаются. По определенным, заранее известным, атрибутам или по любому из доступных?
AlexGousev увеличьте раза в два минимум для создания дом-объекта - если там не одиночные мегабайтные тексты. На типовом хостинге памяти не хватит. Вы собираетесь создавать заведомо нерабочий скрипт, причем сознательно вводя в заблуждение заказчика, показывая ему что все работает.
armadillo :-D я уже сказал задачу) мне нада иметь базу данных, заполняя её каждые 15 минут получением пакетов от сервера вида <O и_тут_разные_параметры_для_каждой_категории /> т.е. имею динамическую БД, а нада ещё в статическую преобразовать)))))))))))) но вот про заказчика - эт посмеялсяконечно)))))))))))) AlexGousev выборка идёт по заранее известным параметрам. их не очень много, но пакет нужен весь. у мя мысль появилась сделать поля под параметры выборки, парсить пришедший XML, записывать в эти поля, а остальные поля - как text делать ВЕСЬ xml-пакет, ведь возвращать я должен именно XML. помойму пока что лучшая вариация, что пришла в голову
Ну тогда эти параметры, по которым выборка в отдельные столбцы, а остальное в массив и serialize его в поле типа text armadillo Простите, отвык от типовых хостингов