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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа с XML файлами. Хранение, обработка...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
dropoff
Отправлено: 26 Ноября, 2014 - 21:01:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Всем привет.

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

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

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

Как быть?
К примеру я обработал файл и получил массив. Вывел содержимое на страницу... как хранить эти данные? допустим я изменил в одном элементе число. Куда мне сохранять это временно? Писать в БД? Или сразу загонять все во временную таблицу БД, а потом от туда, уже после обработки, заливать в рабочие таблицы?
 
 Top
Dastor
Отправлено: 26 Ноября, 2014 - 23:11:00
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Окт. 2014  


Помог: 3 раз(а)




БД MySql?
Загружай во временную таблицу с помощью load xml infile.
Содержимое временной таблицы выводи на страницу. Сделай возможность редактирования данных во временной таблице (также для удобства можно добавить паджинацию, фильтрацию и сортировку). Можно воспользоваться какой-нибудь готовой библиотекой, позволяющй работать с гридами.
А потом уже можно заливать в рабочую таблицу.
 
 Top
dropoff
Отправлено: 27 Ноября, 2014 - 08:12:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




С этим да, так и сделаю. (бд да, mysql)

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

возник вопрос добавления всего из файла в БД.
как это лучше реализовать? Ну разобрал я файл в котором 50к товара.
Как мне пихнуть это в тестовые таблицы в базе? Нужно то быстро это все делать, а не ждать обработки.
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Ноября, 2014 - 10:21:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Помоему вообще достаточно будет simplexml_load_file - там есть флаги оптимизации LIBXML_PARSEHUGE и LIBXML_COMPACT. А вставлять в БД пачками по 100 штук в одном инсерте.
 
 Top
Dastor
Отправлено: 27 Ноября, 2014 - 10:28:30
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Окт. 2014  


Помог: 3 раз(а)




dropoff пишет:
возник вопрос добавления всего из файла в БД.
как это лучше реализовать?

Пробуйте загрузить с помощью load xml infile.
http://dev.mysql.com/doc/refman/5.5/en/load-xml.html

(Отредактировано автором: 27 Ноября, 2014 - 10:29:04)

 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Ноября, 2014 - 10:51:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Он хочет перед вставкой в БД вывести на страницу, как я понял с возможностью вообще отказаться от добавления в БД, просмотреть корректность данных и все такое.
 
 Top
dropoff
Отправлено: 27 Ноября, 2014 - 10:56:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Dastor пишет:
Пробуйте загрузить с помощью load xml infile.

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

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

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

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

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

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


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Окт. 2014  


Помог: 3 раз(а)




Цитата:
получить из файла и сохранить с нужной структурой опять в файл

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



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Dastor пишет:
Покажите, пример прайса, пожалуйста.

по типу как у Я.Маркет.
 
 Top
Panoptik
Отправлено: 27 Ноября, 2014 - 11:13:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




во первых ни один человек не сможет нормально проанализировать данные о 50к объектах, так что вывод для визауально или еще какой проверки считаю безполезным

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

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

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


-----
Just do it
 
 Top
dropoff
Отправлено: 27 Ноября, 2014 - 11:19:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Panoptik пишет:
имхо вариант с временной таблицей будет удобнее всего

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

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


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Окт. 2014  


Помог: 3 раз(а)




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

Никто и не говорил гонять данные туда-сюда. Речь шла о том, что загрузить данные во временную таблицу. Потом с этой таблицей работать из gui.
Вопрос сейчас как быстро загрузить данные из xml в бд.
 
 Top
Panoptik
Отправлено: 27 Ноября, 2014 - 11:33:30
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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.mysql.com/doc/refman/5.5/en/load-xml.html

(Отредактировано автором: 27 Ноября, 2014 - 11:34:01)



-----
Just do it
 
 Top
dropoff
Отправлено: 27 Ноября, 2014 - 12:04:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




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

(Отредактировано автором: 27 Ноября, 2014 - 12:05:21)

 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Ноября, 2014 - 12:33:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




dropoff пишет:
а если там других данных полно?
Вот поэтому я и сказал что симплеХМЛ должно хватить. В любом случае провалидировать придется весь файл, может он брокнутый. А вот после первичной проверки его можно сохранить в нескольких временных файлах где в каждом файле будет штук по 100 узлов ( http://php.net/manual/ru/simplex...lement.asxml.php ). Тогда пусть это проверяют уже глазами по блокам в удобное время, правят нужные данные, и вот этот кусок после исправлений в нужном формате с нужными именами полей уже вставлять в БД.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB