librown
@librown
На-все-руки-мастер и немного кодер

Как с помощью LOAD XML INFILE разобраться повторяющиеся теги и загнать их в Mysql?

Привет!
Есть большой xml-файл (500-900МБ, 100-500 тысяч строк). Нужно его импортировать в Mysql.

1. Сначала я попробовал через XMLReader(). Но это недостаточно быстро.

2. Потом узнал о функции LOAD XML INFILE. Скорость великолепная. Но возникла проблема, приведу пример структуры xml-файла:
<items>
<item param1="val1">
   <name>name_val</name>   
   <photo>photo1_val</photo>
   <photo>photo1_val</photo>
   <photo>photo3_val</photo>
</item>
</items>

Использую такой запрос:
LOAD XML INFILE '/file.xml'
INTO TABLE item
ROWS IDENTIFIED BY '<item>'

Все поля и параметры правильно заходят в БД, кроме 'photo'. В БД попадает только значение последнего блока 'photo3_val'.

Пробую так, но такой код не работает:
LOAD DATA INFILE '/file.xml'
INTO TABLE item 
CHARACTER SET 'utf8'
LINES STARTING BY '<item>' TERMINATED BY '<\item>'
(@tmp)
SET 
photo1 = ExtractValue(@tmp, '/photo[0]'),
photo2 = ExtractValue(@tmp, '/photo[1]'),
photo3 = ExtractValue(@tmp, '/photo[2]')


Подскажите правильное направление.
Спасибо!
  • Вопрос задан
  • 726 просмотров
Пригласить эксперта
Ответы на вопрос 1
zergon321
@zergon321
Попробуйте процедуру со следующим кодом:
DECLARE size INT UNSIGNED DEFAULT ExtractingValue(xml_file, "count(//item)");
DECLARE counter INT UNSIGNED DEFAULT 1;

WHILE counter <= size DO
    INSERT INTO your_table
    VALUES
    (
    ExtractValue(xml_file, "//item[$counter]/name"),
    ExtractValue(xml_file, "//item[$counter]/photo[1]"), #элементы нумеруются с 1, а не с 0; 
    ExtractValue(xml_file, "//item[$counter]/photo[2]") #и так для всех остальных фото
    );
    SET counter = counter + 1;
END WHILE;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы