LINUX.ORG.RU

XML парес в MySQL

 ,


0

1

Добрый день. Столкнулся со следующей проблемой. У поставщика имеется xml файл со следующим содержанием:

<offer id="" available="true">
<url></url>
<price_opt></price_opt>
<opt_list_price></opt_list_price>
<price></price>
<list_price></list_price>
<currencyId></currencyId>
<categoryId></categoryId>
<picture>ссылка на картину 1</picture>
<picture>ссылка на картину 2</picture>
<picture>ссылка на картину 3</picture>
<picture>ссылка на картину 4</picture>
<picture>ссылка на картину 5</picture>
<name></name>
<vendor></vendor>
<vendorCode></vendorCode>
<description></description>
<dimensions></dimensions>
<is_female></is_female>
<is_male></is_male>
<Страна></Страна>
<Производство></Производство>
<Материал></Материал>
</offer>

я у себя создал базу:

CREATE TABLE `offers` (
  `id` int(11) NOT NULL DEFAULT '0',
  `available` enum('true') DEFAULT NULL,
  `url` text,
  `price_opt` int(11) DEFAULT NULL,
  `opt_list_price` int(11) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `list_price` int(11) DEFAULT NULL,
  `currencyId` text,
  `categoryId` int(11) DEFAULT NULL,
  `picture` text,
  `name` text,
  `vendor` text,
  `vendorCode` text,
  `description` text,
  `dimensions` text,
  `is_female` enum('1','0') DEFAULT NULL,
  `is_male` enum('1','0') DEFAULT NULL,
  `Страна` text,
  `Производство` text,
  `Материал` text,
  `Цвет` text,
  `Размер` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

и извлекаю данные из xml командой:

LOAD XML INFILE '/tmp/sync/opt.xml' into table database.offers character set utf8 rows identified by '<offer>';

И все вроде бы хорошо, но в колонку

`picture` text,
извлекается последняя ссылка из всех. То есть, если у поставщика будет 5 ссылок, в таблицу добавится только последняя. Подскажите, как выйти из данной ситуации?

парсить xml самому и использовать postgres вместо mysql

quest ★★★★
()
Ответ на: комментарий от chkalov

Верно я уже пришел к выводу, что нужно добавить столбцы в таблицу типа:

CREATE TABLE `offers` (
  `id` int(11) NOT NULL DEFAULT '0',
  `available` enum('true') DEFAULT NULL,
  `url` text,
  `price_opt` int(11) DEFAULT NULL,
  `opt_list_price` int(11) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `list_price` int(11) DEFAULT NULL,
  `currencyId` text,
  `categoryId` int(11) DEFAULT NULL,
  `picture_1` text,
  `picture_2` text,
  `picture_3` text,
  `picture_4` text,
  `picture_5` text, 
  `name` text,
  `vendor` text,
  `vendorCode` text,
  `description` text,
  `dimensions` text,
  `is_female` enum('1','0') DEFAULT NULL,
  `is_male` enum('1','0') DEFAULT NULL,
  `Страна` text,
  `Производство` text,
  `Материал` text,
  `Цвет` text,
  `Размер` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

и каждый следующий <picture> в рамках одного id, добавлять в `picture_+1` .

mkondratev
() автор топика
Ответ на: комментарий от mkondratev

Или редактировать сам xml на лету, изменив:

<picture>ссылка на картину 1</picture>
<picture>ссылка на картину 2</picture>
<picture>ссылка на картину 3</picture>
<picture>ссылка на картину 4</picture>
<picture>ссылка на картину 5</picture>
на

<picture_1>ссылка на картину 1</picture_1>
<picture_2>ссылка на картину 2</picture_2>
<picture_3>ссылка на картину 3</picture_3>
<picture_4>ссылка на картину 4</picture_4>
<picture_5>ссылка на картину 5</picture_5>

mkondratev
() автор топика
Ответ на: комментарий от mkondratev

это тонкий намек на то, что если в mysqlной базе понадобится VARRAY выхода два: либо брызгать слюной «не нужно», либо использовать отдельную таблицу и джойнить

vostrik ★★★☆
()
Ответ на: комментарий от mkondratev

Можно заносить картинки в таблицу, связанную с offers. Таким образом можно будет иметь неограниченое количество картинок на один offer.

goingUp ★★★★★
()
Ответ на: комментарий от vostrik

Что? В строку-то всегда можно json затолкать. Иногда это легче, чем делать отдельную таблицу, особенно когда данные часто обновляются.

anonymous
()
Ответ на: комментарий от anonymous

ну запихнул ты их, и чо? как ты их строкой запихнул, так назад строкой и получишь, толку с такого массива

vostrik ★★★☆
()
Ответ на: комментарий от vostrik

в оракле идеологически чуждого говна еще больше, это ж не повод во все СУБД его тащить

Если учесть, что в postgresql можно строить быстрые индексы по этим полям, то существование массивов ни на сколько не ухудшает постгрес, а в данном конкретном применении - упрощает использование и логику.

AnDoR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.