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 файлами. Хранение, обработка... [2]

 PHP.SU

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


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

> Без описания
dropoff
Отправлено: 27 Ноября, 2014 - 13:10:48
Post Id



Посетитель


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


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




я тут уже поглумился над XMLReader.
у него есть http://php.net/manual/ru/xmlreader.isvalid.php
пойдет для валидации?

в принципе я уже написал обработку прайса, беру из него отдельно категории и отдельно продукты.
теперь получается нужно писать в файл по нужному количество блоков и дальнейшей обработки, как вы и предложили.
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Ноября, 2014 - 13:21:41
Post Id



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


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


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




dropoff пишет:
пойдет для валидации?
Ага.
(Добавление)
dropoff пишет:
теперь получается нужно писать в файл по нужному количество блоков и дальнейшей обработки, как вы и предложили.
Я имел ввиду вообще создать кучу файлов и выводить их в выпадающем селекте. Когда человек разобрал блок, нажимает экспорт в БД, тогда разобранный файл удаляется, а до этого, все правки внесенные в этот XML-объект перезаписывать в этот самый файл. Тут правда если работать будет несколько человек, надо позаботиться о блокировках редактируемых файлов - это кстати можно вынести в БД - вася правит файл А, петя файл Б, тогда маша увидит в списке только файл В, к редактированию которого и приступит.
 
 Top
dropoff
Отправлено: 27 Ноября, 2014 - 13:42:59
Post Id



Посетитель


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


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




DeepVarvar пишет:
Я имел ввиду вообще создать кучу файлов и выводить их в выпадающем селекте.

такое будет не удобно. нужен поиск по и сортировка по товарам, чтобы находить нужные и проделывать с ними необходимые операции.
я думал разбить на части, чтобы просто импортировать в БД было удобнее.
 
 Top
Sail
Отправлено: 27 Ноября, 2014 - 13:49:47
Post Id



Участник


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


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




dropoff пишет:
я думал разбить на части, чтобы просто импортировать в БД было удобнее

Предложенная DeepVarvar схема для этого и предназначена. Хорошо
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Ноября, 2014 - 14:16:20
Post Id



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


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


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




dropoff пишет:
нужен поиск по и сортировка по товарам
Первичный экспорт товаров не должен включать в себя полный функционал управления, фильтрации и пр. Первым этапом достаточно убедиться что все ровно, что-то подправить и экспортировать уже в большую таблицу в БД, а уже там делать все что угодно и когда угодно.
 
 Top
dropoff
Отправлено: 27 Ноября, 2014 - 23:19:54
Post Id



Посетитель


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


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




DeepVarvar пишет:
Первичный экспорт товаров не должен включать в себя полный функционал управления, фильтрации и пр

ну это понятно. я почему и хочу загонять в БД, во временную таблицу.

что-то я туплю малость видимо.
каким образом по нужному количеству блоков забивать в файл?
накодил для обработки примерно следующее
PHP:
скопировать код в буфер обмена
  1.         public function myAnySuperMethod($file)
  2.         {
  3.                 // какие блоки вытаскиваем
  4.                 $type = 'product';
  5.  
  6.                 $xml_reader = XMLReader::open($file);
  7.  
  8.                 while ($xml_reader->read() && $xml_reader->name != $type);
  9.  
  10.                 $xml = array();
  11.                 while ($xml_reader->name == $type)
  12.                 {
  13.                         if ($type == 'product')
  14.                         {
  15.                                 $xml[] = simplexml_load_string($xml_reader->readOuterXML());
  16.                         }
  17.  
  18.                         $xml_reader->next($type);
  19.                 }
  20.  
  21.                 $xml_reader->close();
  22.  
  23.                 return $xml;
  24.         }
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Ноября, 2014 - 08:18:33
Post Id



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


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


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




получить через xpath интересующие корневые узлы блоков, в цикле считать до N, конкатенируя $out .= $node->asXML(); а когда дошел N, записать в файл, и так пока узлы не кончатся. Только сразу скажу - корневой элемент в результирующем файле должен быть ОДИН, это значит надо обернуть вывод типа так:
CODE (xml):
скопировать код в буфер обмена
  1. <root>..N узлов..</root>
 
 Top
dropoff
Отправлено: 28 Ноября, 2014 - 16:50:45
Post Id



Посетитель


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


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




DeepVarvar пишет:
получить через xpath интересующие корневые узлы блоков

если честно, не очень понял как это сделать.
 
 Top
dropoff
Отправлено: 29 Ноября, 2014 - 11:27:03
Post Id



Посетитель


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


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




разобрался.

подскажите последнее. как правильно в while мне отсчитать 100 элементов массива , чтобы записать в файл.
точнее как правильно условие составить, а то чет у меня пишет больше чем нужно.

(Отредактировано автором: 29 Ноября, 2014 - 11:40:33)

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



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


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


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




PHP:
скопировать код в буфер обмена
  1. $xml = new SimpleXMLElement($xmlString);
  2. $i = 1;
  3. $c = 1;
  4. $max = 100;
  5. $out = '';
  6. $nodes = $xml->xpath('//nodename');
  7. $s = sizeof($nodes) - 1;
  8. foreach ($nodes as $k => $node) {
  9.     if ($i > $max || $k == $s) {
  10.         file_put_contents('file-' . $c . '.xml', '<root>' . $out . '</root>');
  11.         $i = 1;
  12.         $out = '';
  13.         $c += 1;
  14.     }
  15.     $out .= '<node>' . $node->asXML() . '</node>';
  16.     $i += 1;
  17. }

Писано на коленке, естессно не проверял.
 
 Top
dropoff
Отправлено: 29 Ноября, 2014 - 13:40:15
Post Id



Посетитель


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


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




Спасибо.
Только возник вопрос. Мне $xmlString как получить из XMLReader ?
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Ноября, 2014 - 13:53:11
Post Id



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


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


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




Зачем? Я же говорил что достаточно загрузить текст файла через ф-цию sipmlexml_load_file, которая при успешном парсе вернет объект класса SimpleXMLElement, т.е.:
PHP:
скопировать код в буфер обмена
  1. $xml = sipmlexml_load_file('blah.xml');

и

есть одно и то же.
 
 Top
dropoff
Отправлено: 29 Ноября, 2014 - 14:03:34
Post Id



Посетитель


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


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




а. все. что-то затупил.

Да, все работает, разбивает по файлам как нужно.
Спасибо большое за помощь!
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Ноября, 2014 - 14:07:22
Post Id



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


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


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




В таком случае XMLReader вообще нафик не нужен.
 
 Top
dropoff
Отправлено: 29 Ноября, 2014 - 14:09:17
Post Id



Посетитель


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


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




ага, уже изменил.
 
 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