При создании интернет-магазинов очень часто требуется наполнение интернет магазина товарами с других, более крупных интернет-магазинов. Помимо этого постоянно изменяются цены на товар, кол-во на складе, и т.д.
Крупные интернет-магазины как правило предоставляют XML-шлюзы, чтобы более мелкие магазины (дилеры) могли продавать их товары. Для того чтобы стать дилером крупного интернет-магазина нужно найти на сайте раздел XML-шлюз, или обратиться к администрации магазина.
После чего с помощью PHP DOM пропарсить xml-шлюз, и занести товар в базу данных.
В качестве примера возьмем небольшой XML-файл состоящий из 2-ух товаров интернет-магазина:
<?xml version="1.0" encoding="utf-8"?> <root> <product> <product_id>1</product_id> <code>Z7900</code> <name>Картина Divide et Impera</name> <image src="Z7900s1.jpg" width="140" height="140" type="JPG"/> <desc>Изделие упаковано в темно-красную подарочную коробку</desc> <price>11788,00</price> <made>Производитель: дизайн студия http://ox2.ru/</made> </product> <product> <product_id>2</product_id> <code>Z7901</code> <name>Картина Nika</name> <image src="Z7901s1.jpg" width="140" height="140" type="JPG"/> <desc>Изделие упаковано в темно-красную подарочную коробку с замочком</desc> <price>24295</price> <made>Производитель: дизайн студия http://ox2.ru/</made> </product> </root>
PHP-скрипт:
<?php /** * Класс для разбора продуктов взятых из xml-шлюза * @author дизайн студия ox2.ru */ class ParserXML { /** * Метод для парсинга xml-файла с продуктами * @param <string> $xml_file - путь до xml-файла с продуктами */ public function Products($xml_file) { $dom = new DOMDocument(); $dom->load($registry->base_dir . "xml/products.xml"); //Открываем xml-файл foreach ($dom->documentElement->childNodes as $products) { //Обходим корневой узел root if ($products->nodeType == 1 && $products->nodeName == "product") { //Если узел product, то начинаем его обход foreach ($products->childNodes as $product) { //Проходим узел product, и выводим на экран его потомков if ($product->nodeType == 1 && $product->nodeName == "product_id") { //Если узел product_id echo "ID-продукта: ".$product->textContent."<br/>"; //Выводим текстовую информацию, которая внутри узла product_id } if ($product->nodeType == 1 && $product->nodeName == "articul") { echo "Артикул: ".$product->textContent."<br/>"; } if ($product->nodeType == 1 && $product->nodeName == "name") { echo "Название: ". $this->_utf8_to_cp1251($product->textContent)."<br/>"; //Выводим текстовую информацию узла, и переводим ее в кодировку cp1251 } if ($product->nodeType == 1 && $product->nodeName == "image") { echo "Изображение: ".$product->getAttribute("src")."<br/>"; //Выводим атрибут узла } if ($product->nodeType == 1 && $product->nodeName == "desc") { echo "Описание: ".$this->_utf8_to_cp1251($product->textContent)."<br/>"; } if ($product->nodeType == 1 && $product->nodeName == "price") { echo "Стоимость: ".$product->textContent."<br/>"; } if ($product->nodeType == 1 && $product->nodeName == "made") { echo "Производитель: ".$this->_utf8_to_cp1251($product->textContent)."<br/><br/>"; } } } } } /** * Конвертируем строку из кодировки utf-8 в cp-1251 * @param <type> $string * @return <type< */ private function _utf8_to_cp1251($string) { return iconv("utf-8", "cp1251//IGNORE", $string); } } $parser = new ParserXML(); $parser->Products("products.xml"); ?>
В статье использовались следующие свойства и методы:
Свойство nodeType – возвращает информацию об узле, может принимать значение:
1 — дескриптор
2 — атрибут
3 — текст (включая пробелы)
8 — HTML-комментарий
9 — документ
10 — DTD (определение типа документа)
11 — фрагмент
Свойсто nodeName - возвращает информацию об имени узла
Свойство childNodes — массив дочерних узлов
Метод getAttribute — возвращает значение свойства
Так же для обхода XML можно использовать XPath, но об этом в следующих статьях
Комментарии
Заполните все поля
Написать комментарий