Парсинг XML формата CommerceML средствами PHP
Очередная задача — синхронизация цен на сайте по файлу-выгрузке из 1С 8.2.
В движке решил не копаться — найти цены в БД и напрямую их корректировать — ИМХО так будет проще, чем искать какие то сторонние спец.модули.
Вроде всё ясно — берём файл, парсим, апдейтим.
Как всегда не обошлось без НО.
Файл-выгрузка оказался в формате «CommerceML» в формате xml version=»1.0″ encoding=»UTF-16″ с кириллицей везде — даже в наименованиях секций.
В общем первые попытки парсинга с помощью simplexml и DomDocument не увенчались успехом, а вот XMLReader, как раз рассчитанный на обработку файлов больших объёмов (что нам и нужно — прайсы, как правило имеют особенность безгранично расти).
Пока не забыл — порекомендую отличнейшую статейку, найденную в процессе реализации задачи — XML для PHP-разработчиков: Часть 2. Расширенные методы парсинга XML — различные методы работы с XML, всё с примерами и описанием.
Далее: … так как порядок в файле всегда идёт АРТИКУЛ и далее ЦЕНА, то особенно заморачиваться с обработкой вложений я не стал … в итоге получился такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php $reader = new XMLReader(); $reader->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."<br/>"; // сюда добавлю код по обновлению цен в БД } ?> |
рубрики: CMS, Полезности, Программирование | Комментарии (0)