За последние 24 часа нас посетили 58236 программистов и 1850 роботов. Сейчас ищут 1472 программиста ...

Перевод xml в MySQL

Тема в разделе "Прочие вопросы по PHP", создана пользователем ast, 11 янв 2008.

  1. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    День добрый. Столкнулся с проблемой такого вида:
    есть xml-пакеты вида <TAG param1="1" param2="2" qweqwe="123"/>
    нада сделать из них базу данных, по которой можно будет выборку делать, мол:
    ВЫБРАТЬ всё ГДЕ param1 > 1 И param1 < 100;

    к примеру. ручками вбивать все поля xml-пакета не предоставляеться возможным. помогите решить проблему :)

    Спасибо!
     
  2. andrvm

    andrvm Активный пользователь

    С нами с:
    12 окт 2007
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Moscow
    .
    сорри ошибся темой
     
  3. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    andrvm
    принято ;)
     
  4. andrvm

    andrvm Активный пользователь

    С нами с:
    12 окт 2007
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Moscow
  5. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
  6. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    andrvm
    а, не, мне ненужен парсер xml))))))) я итак парсю его =) мне нада придумать, как хранить эти данные) начинаю понимать, что нет смысла перегонять в MySQL, придёться другой способ юзать какой то
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ??
     
  8. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    armadillo
    да мне нада сделать БД, имея xml-данные. а вот как - не знаю ;(
     
  9. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    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: разберемся что куда ;-)
     
  10. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    AlexGousev
    HTML:
    1. <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"/>
    2. <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"/>
    3. <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"/>
    4. <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МБ. а вот запросы от разных пользователей могут идти довольно часто (гдето раз в минуту, для того, что делаю - это часто :))
     
  11. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Если это все, то тут и XQuery не нужен :)

    PHP:
    1. <?php
    2.  
    3. $xmlstr = file_get_contents('http://example.com/export.xml');
    4.  
    5. $xml = new DOMDocument();
    6. $xml->loadXML($xmlstr);
    7.  
    8. foreach ($xml->firstChild->childNodes as $child)
    9.    mysql_query('insert into table set od="'.$child->getAttribute('OD').'", get_day="'.$child->getAttribute('get_day').'"');
    10.  
    11. ?>
     
  12. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    AlexGousev
    ну, я так же делал ;) тока в том то и дело, что мне поля для каждого параметра прописывать нет возможности. о том и речь, в том и проблема...... мне нада хранить данные, зная только названия полей, но не их количество к примеру...... там есть ~20 типов пакетов с совершенно разными параметрами
     
  13. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ничего не понял :)
    Начнем сначала: структура исходного XML-файла известна или нет?
     
  14. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    AlexGousev
    я имею дело не совсем с чистым XML. а тока с тегами и параметрами внутри него... т.к. сказать...
    это, по сути дела, магазин. допустим, выбираю я пункт "вещи", и мне приходят <O ... /> для вещей, выбераю "медицина", и приходят <O ... />, но уже с параметрами медицинскими... причем их очень много, чтобы заранее под каждое сделать поле в MySQL. так что нада придумывать альтернативный способ использования.
    к примеру, можно сохранить тоо, что шлёт сервак, в файлах(обновление файлов каждые 15 минуь ), а потом эти файлы использовать как БД для выдачи данных по запросам (в том числе выборка вида "от и до")
     
  15. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    проблема остаёться проблемой ;(
     
  16. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Можно сделать это динамически.

    Точно также можно создать несколько таблиц, вместо файлов, и загнать туда данные.

    Можно было бы сделать одну большую таблицу, в которую загнать основные данные, и одну вспомогательную, в которой хранить остальное. Но такой подход имеет смысл, если хотя бы 2/3 данных в разных xml совпадает (по смыслу).

    Ну и в обеих вариантах имеет смысл отдать одну таблицу под хранение соответствия xml-файла названию таблицы.
     
  17. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    RomanBush как раз динамически это сделать и не получиться ;(

    про создание таблицы под данные - сразу говорю, НЕТ) тут НЕ(!) подойдёт вариант с вбиванием полей параметров ручками. что-то другое надо явно
     
  18. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    блин....
     
  19. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    А. если не секрет - почему не получится?
     
  20. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    это годится только для очень малых объемов, он все кладет в память.
    я использую 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 # чтобы было индексированное поля
     
  21. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    И это хорошо, что в память: можно работать с документом, а не просто парсить его куда-то. Ну а 100-мегабайтные файлы мало кто юзает…

    ast
    А все-таки какого типа выборки делаются. По определенным, заранее известным, атрибутам или по любому из доступных?
     
  22. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    AlexGousev
    увеличьте раза в два минимум для создания дом-объекта - если там не одиночные мегабайтные тексты. На типовом хостинге памяти не хватит.
    Вы собираетесь создавать заведомо нерабочий скрипт, причем сознательно вводя в заблуждение заказчика, показывая ему что все работает.
     
  23. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    armadillo

    :-D я уже сказал задачу) мне нада иметь базу данных, заполняя её каждые 15 минут получением пакетов от сервера вида <O и_тут_разные_параметры_для_каждой_категории />
    т.е. имею динамическую БД, а нада ещё в статическую преобразовать)))))))))))) но вот про заказчика - эт посмеялсяконечно))))))))))))

    AlexGousev
    выборка идёт по заранее известным параметрам. их не очень много, но пакет нужен весь. у мя мысль появилась сделать поля под параметры выборки, парсить пришедший XML, записывать в эти поля, а остальные поля - как text делать ВЕСЬ xml-пакет, ведь возвращать я должен именно XML. помойму пока что лучшая вариация, что пришла в голову
     
  24. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну тогда эти параметры, по которым выборка в отдельные столбцы, а остальное в массив и serialize его в поле типа text

    armadillo
    Простите, отвык от типовых хостингов :)
     
  25. ast

    ast Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    22
    Симпатии:
    0
    AlexGousev
    да, видимо так и сделаю :)