При создании интернет-магазинов очень часто требуется наполнение интернет магазина товарами с других, более крупных интернет-магазинов. Помимо этого постоянно изменяются цены на товар, кол-во на складе, и т.д.
Крупные интернет-магазины как правило предоставляют 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, но об этом в следующих статьях





Уроки по PHP
JavaScript
Уроки по HTML
Дизайнерам
СЕОшникам
Разное


Комментарии
Заполните все поля
Написать комментарий