Обработка или парсинг файлов формата Яндекс.Маркет (YML) на PHP и ASP.NET (C#)

Пн, 19 декабря 2011 @ 9:10 AM написал в Работаем с YML4 комментариев

В последнее время всё активнее обсуждаются вопросы обмена товарными предложениями в формате Яндекс.Маркет, а именно, разработанного компанией Яндекс формата YML на основе XML.

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

Для интернет-магазинов размещение товарных предложений на Яндекс.Маркет создает приличный трафик потенциальных покупателей. Этот стимул создал необходимый спрос на автоматизированную подготовку yml-файлов и теперь практически для всех популярных CMS интернет-магазинов можно найти соответствующие модули и плагины.

 интернет-магазины в результатах поиска на Яндекс.Маркет

Упрощает добавление каталога товаров при использовании yml-файлов и в товарные агрегаторы или торговые площадки. Это сайты и порталы, предоставляющие возможность поиска товаров и услуг по каталогам интернет-магазинов, которые у них зарегистрированы. По основному функционалу похожи на сервис Яндекс.Маркет, однако условия работы с магазинами может отличаться.

В последнем случае при разработке торговой площадки возникает необходимость обработки (или парсинга) yml-файлов интернет-магазинов на стороне сервера и импорт полученной информации в соответствующие таблицы и поля базы данных.

Вообще, парсинг XML не является проблемой даже для начинающего веб-девелопера, но чтобы не терять время на создание собственных скриптов, кому-то помогут простые примеры для основных языков и технологий веб-программирования, а именно PHP и ASP.NET.

Рассмотрим простую задачу:
парсинг файла формата YML произвольного типа товаров (vendor.model) с несколькими товарными категориями и товарными предложениями в кодировке win-1251.
Файл можно посмотреть здесь.

Сегодня практически все хостинги предоставляют обработчик PHP версии 5 и выше, поэтому будем предполагать именно такой хостинг.
Напомню, что PHP с версии 5 предлагает воспользоваться достаточно простой функцией, которая называется simplexml_load_file и служит для конвертирования любого xml-файла в объект.

Код yml парсера на языке PHP:


<?
$url = 'http://site.ru/yandex.xml'; //адрес YML-файла

$yml = simplexml_load_file($url); //Интерпретирует XML-файл в объект

//цикл для обхода по всем товарам
foreach ($yml->catalog->item as $item) {
echo '

'.$item->title.'

'; //выводим на печать заголовок статьи
echo $item->description; //выводим на печать текст статьи
}
?>


Очень просто, не правда ли?
Что делать с полученными данными далее решать Вам: можете добавить их в собственную базу данных или получить какие-либо статистические данные, например, сколько товарных позиций и в каких категориях в данном прайс-листе интернет-магазина, файл которого был обработан.
А ещё можно сделать сервис, производящий глубокий анализ синтаксиса, семантики и возможных внутренних ошибок указанного файла.

Теперь, как я и обещал, будет показан пример обработчика для парсинга подобного файла для хостинга с поддержкой ASP.NET.

Код ASP.NET C#:

<%

protected void Page_Load(object sender, EventArgs e)
{
int ItemsCount = 0;
decimal DishesTotal = 0;
UInt16 CaloriesTotal = 0;
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
NameTable nt = new NameTable();
object food = nt.Add("food");
object price = nt.Add("price");
object calories = nt.Add("calories");
settings.NameTable = nt;
string MenuFile = Path.Combine(Request.PhysicalApplicationPath, "menu.xml");
using (XmlReader reader = XmlReader.Create(MenuFile, settings))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
food.Equals(reader.LocalName))
{
ItemsCount++;
}
if (reader.NodeType == XmlNodeType.Element &&
price.Equals(reader.LocalName))
{
DishesTotal +=
(UInt16)reader.ReadElementContentAsDecimal();
}
if (reader.NodeType == XmlNodeType.Element &&
calories.Equals(reader.LocalName))
{
CaloriesTotal +=
(UInt16)reader.ReadElementContentAsInt();
}
}
}
Response.Write(String.Format("Вы заказали {0} блюда на сумму {1:C}, {2} калорий",
ItemsCount, DishesTotal, CaloriesTotal));
}

%>


Да, немного сложнее чем на PHP, но смело можно утверждать, что это уровень начинающего веб-программера и любой желающий с этим справится.

Все скрипты полностью рабочие.
Проверить результат выполнения кода на PHP можете здесь.

P.S. В случае, если кодировка xml-файла отличается от Windows-1251, например, UTF-8, то необходимо будет дополнительно сконвертировать получаемые данные при помощи встроенных функций (не на всех хостингах данные функции подключены по умолчанию), либо написать свои функции по конвертации из одной кодировки в другую благо примеров и исходников в интернете множество.

Тагильцев Ю.В.
http://tagiltsev.ru/?goto=309

Теги: php

Всего 4 комментариев на эту тему

  • Гость написал 2012-01-24 18:12:04:

    у меня не работает ваш код на C#

  • алекс написал 2012-03-22 17:58:26:

    интересно, спасибо!

  • Максо написал 2012-06-16 11:04:50:

    http://www.tagiltsev.ru/tempfiles/yml-sample.xml
    Битая ссыль

  • Владимир написал 2016-06-13 18:51:14:

    Вот стандартная норм ссылка http://tytmodno.com/standart_yml_catalog.xml

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

поставьте галочку если вы не бот)