Наше прошлое 20072009201120132014
г. Москва, ул. Гостиничная, д. 7А. кор.2
8 (499) 404-26-56
пн-пт 11:00 - 19:00
 

Работа с DOM средствами PHP5

При создании интернет-магазинов очень часто требуется наполнение интернет магазина товарами с других, более крупных интернет-магазинов. Помимо этого постоянно изменяются цены на товар, кол-во на складе, и т.д.

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

Скачать исходник

При создании интернет-магазинов очень часто требуется наполнение интернет магазина товарами с других, более крупных интернет-магазинов. Помимо этого постоянно изменяются цены на товар, кол-во на складе, и т.д. Крупные интернет-магазины как правило предоставляют XML-шлюзы, чтобы более мелкие магазины (дилеры) могли продавать их товары.

Комментарии

Нет комментариев

Заполните все поля

Написать комментарий

Ваше имя

Комментарий