.
Место для Вашей рекламы
12 Сентябрь 2013

Парсинг XML формата CommerceML средствами PHP

posted in CMS, Полезности, Программирование |

Очередная задача — синхронизация цен на сайте по файлу-выгрузке из 1С 8.2.
В движке решил не копаться — найти цены в БД и напрямую их корректировать — ИМХО так будет проще, чем искать какие то сторонние спец.модули.
Вроде всё ясно — берём файл, парсим, апдейтим.
Как всегда не обошлось без НО.
Файл-выгрузка оказался в формате «CommerceML» в формате xml version=»1.0″ encoding=»UTF-16″ с кириллицей везде — даже в наименованиях секций.
В общем первые попытки парсинга с помощью simplexml и DomDocument не увенчались успехом, а вот XMLReader, как раз рассчитанный на обработку файлов больших объёмов (что нам и нужно — прайсы, как правило имеют особенность безгранично расти).

Пока не забыл — порекомендую отличнейшую статейку, найденную в процессе реализации задачи — XML для PHP-разработчиков: Часть 2. Расширенные методы парсинга XML — различные методы работы с XML, всё с примерами и описанием.

Далее: … так как порядок в файле всегда идёт АРТИКУЛ и далее ЦЕНА, то особенно заморачиваться с обработкой вложений я не стал … в итоге получился такой код:

open("price.xml");

$art="";
$cost=0;
$arr = array();

while ($reader->read()) {
	switch ($reader->nodeType) {	
		case (XMLREADER::ELEMENT):
			if ($reader->localName == "Артикул") {
				$reader->read();
				$art = $reader->value;
				if ($art!=""&&$cost!=0)	$arr[$art]=$cost;
			}
			if ($reader->localName == "ЦенаЗаЕдиницу") {
				$reader->read();
				$cost = $reader->value;
				if ($art!=""&&$cost!=0)	$arr[$art]=$cost;
			}	
   		}
}

// посмотрим что получилось
foreach($arr as $name=>$val) {
	echo $name." = ".$val."
"; // сюда добавлю код по обновлению цен в БД } ?>

Оставить комментарий

Яндекс.Метрика