Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Работа с XML файлами. Хранение, обработка...
Форумы портала PHP.SU » » XML и его обработка » Работа с XML файлами. Хранение, обработка...

Страниц (3): [1] 2 3 »
 

1. dropoff - 26 Ноября, 2014 - 21:01:47 - перейти к сообщению
Всем привет.

Возникла задача реализовать обработку XML файлов.

Необходимо перед заливкой данных в БД из файла, получить содержимое в качестве массива для возможности вывода на страницу, чтобы можно было что-то изменить, а потом уже заливать в БД.

При этом файлы могут быть очень большие! Скажем там товары и товаров этих 100к.

Как быть?
К примеру я обработал файл и получил массив. Вывел содержимое на страницу... как хранить эти данные? допустим я изменил в одном элементе число. Куда мне сохранять это временно? Писать в БД? Или сразу загонять все во временную таблицу БД, а потом от туда, уже после обработки, заливать в рабочие таблицы?
2. Dastor - 26 Ноября, 2014 - 23:11:00 - перейти к сообщению
БД MySql?
Загружай во временную таблицу с помощью load xml infile.
Содержимое временной таблицы выводи на страницу. Сделай возможность редактирования данных во временной таблице (также для удобства можно добавить паджинацию, фильтрацию и сортировку). Можно воспользоваться какой-нибудь готовой библиотекой, позволяющй работать с гридами.
А потом уже можно заливать в рабочую таблицу.
3. dropoff - 27 Ноября, 2014 - 08:12:52 - перейти к сообщению
С этим да, так и сделаю. (бд да, mysql)

Встал вопрос разбора xml файла. Чем лучше и как?
Смотрел XMLReader и пробовал с ним работать... Все вроде хорошо, но как-то запутанно все)
Может есть какие-то классы-хелперы или аналоги, чтобы можно было с большими объемами работать?
(Добавление)
разобрался с XMLReader вроде.

возник вопрос добавления всего из файла в БД.
как это лучше реализовать? Ну разобрал я файл в котором 50к товара.
Как мне пихнуть это в тестовые таблицы в базе? Нужно то быстро это все делать, а не ждать обработки.
4. DeepVarvar - 27 Ноября, 2014 - 10:21:52 - перейти к сообщению
Помоему вообще достаточно будет simplexml_load_file - там есть флаги оптимизации LIBXML_PARSEHUGE и LIBXML_COMPACT. А вставлять в БД пачками по 100 штук в одном инсерте.
5. Dastor - 27 Ноября, 2014 - 10:28:30 - перейти к сообщению
dropoff пишет:
возник вопрос добавления всего из файла в БД.
как это лучше реализовать?

Пробуйте загрузить с помощью load xml infile.
http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]en/load-xml[dot]html
6. DeepVarvar - 27 Ноября, 2014 - 10:51:55 - перейти к сообщению
Он хочет перед вставкой в БД вывести на страницу, как я понял с возможностью вообще отказаться от добавления в БД, просмотреть корректность данных и все такое.
7. dropoff - 27 Ноября, 2014 - 10:56:58 - перейти к сообщению
Dastor пишет:
Пробуйте загрузить с помощью load xml infile.

это получается, что мне пересохранять придется данные. т.е. получить из файла и сохранить с нужной структурой опять в файл, а только потом загонять в БД. Имхо, как-то не правильно это.

DeepVarvar пишет:
Помоему вообще достаточно будет simplexml_load_file

Это же SimpleXML? Я читал, что лучше XMLReader, так как SimpleXML грузит все в память.

DeepVarvar пишет:
А вставлять в БД пачками по 100 штук в одном инсерте.

Т.е. получить массив из 50к, забить на части и обрабатывать?
А если одновременно идет работа с несколькими прайсами разных объемов, не засрется память то?
Может есть резон каждый прайс обрабатывать через крон?
(Добавление)
DeepVarvar пишет:
Он хочет перед вставкой в БД вывести на страницу, как я понял с возможностью вообще отказаться от добавления в БД, просмотреть корректность данных и все такое

Не просто посмотреть данные, но еще и поправить. при этом нужна будет сортировка и постраничка. Измененные данные нужно где-то так или иначе хранить.
8. Dastor - 27 Ноября, 2014 - 11:09:09 - перейти к сообщению
Цитата:
получить из файла и сохранить с нужной структурой опять в файл

Так конечно делать не надо)
У Вас уже какая-то определенная структура прайса, которую изменить нельзя?
Покажите, пример прайса, пожалуйста.
9. dropoff - 27 Ноября, 2014 - 11:11:44 - перейти к сообщению
Dastor пишет:
Покажите, пример прайса, пожалуйста.

по типу как у Я.Маркет.
10. Panoptik - 27 Ноября, 2014 - 11:13:17 - перейти к сообщению
во первых ни один человек не сможет нормально проанализировать данные о 50к объектах, так что вывод для визауально или еще какой проверки считаю безполезным

во вторых помимо simpleXML есть еще sax. работа с ним конечно не так очевидна, но на больших объемах он себя должен показать хорошо

третье. зачем гонять целый массив данных туда-сюда и сохранять все. а потом снова пересохранять. в бд предусмотрен апдейт по первичному ключу или какому другому условию. поэтому если вы хотите что-то изменить, то изменяйте только конкретные записи, а не пихайте весь массив данных целиком.

имхо вариант с временной таблицей будет удобнее всего, так как обязанности за хранение и обработку данных лягут на внешнюю программу СУБД, а ваш скрипт будет заниматься только своим делом, а именно писать управляющую логику
11. dropoff - 27 Ноября, 2014 - 11:19:36 - перейти к сообщению
Panoptik пишет:
имхо вариант с временной таблицей будет удобнее всего

вот сейчас так и делаю.
но возник вопрос добавления всего из прайса в БД удобным способом, чтобы и нагрузки большой не было и ждать долго не приходилось.

Получается так, что сначала все загоняем во временные таблицы, потом выводим на обработку уже что нужно из БД. имхо, идеальный вариант.
12. Dastor - 27 Ноября, 2014 - 11:25:28 - перейти к сообщению
Panoptik пишет:
третье. зачем гонять целый массив данных туда-сюда и сохранять все. а потом снова пересохранять. в бд предусмотрен апдейт по первичному ключу или какому другому условию. поэтому если вы хотите что-то изменить, то изменяйте только конкретные записи, а не пихайте весь массив данных целиком.

Никто и не говорил гонять данные туда-сюда. Речь шла о том, что загрузить данные во временную таблицу. Потом с этой таблицей работать из gui.
Вопрос сейчас как быстро загрузить данные из xml в бд.
13. Panoptik - 27 Ноября, 2014 - 11:33:30 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $xmlFullPath = __DIR__ . DIRECTORY_SEPARATOR . 'products.xml';
  3. exec('mysql --user=db_user --password=db_password -e "LOAD XML INFILE ' . $xmlFullPath . '"');

http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]en/load-xml[dot]html
14. dropoff - 27 Ноября, 2014 - 12:04:42 - перейти к сообщению
я не очень понял один момент.
структура xml файла тогда должна соответствовать таблице в БД?
а если там других данных полно?
там и категории и продукты и валюты и данные сайта.
получается, придется создавать из основного другие xml файлы и их загонять?
15. DeepVarvar - 27 Ноября, 2014 - 12:33:39 - перейти к сообщению
dropoff пишет:
а если там других данных полно?
Вот поэтому я и сказал что симплеХМЛ должно хватить. В любом случае провалидировать придется весь файл, может он брокнутый. А вот после первичной проверки его можно сохранить в нескольких временных файлах где в каждом файле будет штук по 100 узлов ( http://php.net/manual/ru/simplex...lement.asxml.php ). Тогда пусть это проверяют уже глазами по блокам в удобное время, правят нужные данные, и вот этот кусок после исправлений в нужном формате с нужными именами полей уже вставлять в БД.

 

Powered by ExBB FM 1.0 RC1