Прайсы в формате XML

Эд!

Новичок
День добрый!
Столкнулся с задачей парсинга прайсов, прайсы могут быть форматов xls (xlsx, xlsm), csv и xml.
С xls и csv справился (сделал 3 варианта парсинга - всю таблицу в один раздел каталога, категория товара сидит в одном из столбцов, категория сидит в одной из строк, получилось почти универсально, кому интересно могу поделиться).

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

Подскажите может есть ли уже какой универсальный (либо легко кастомизируемый) парсер xml прайсов, я вижу это так: указываем "синонимы" тегов (расписываем что значит каждый тег в xml) и парсер все парсит ?
 

WMix

герр M:)ller
Партнер клуба
Понаделали блин своих форматов.
а с csv у тебя нет таких проблем, правильно? любое количество полей в любой последовательности можешь импортнуть?
 

Эд!

Новичок
а с csv у тебя нет таких проблем, правильно? любое количество полей в любой последовательности можешь импортнуть?
При тестировании проблем не было, но это все лишь тестирование... В работе обязательно ошибки посыпятся.
Я сделал так:
Есть 3 варианта парсинга xls и csv файлов (xls на сервере сохраняю в csv):
1 вариант: поместить все товары прайса в одну категорию, категорию выбираем из списка;
2 вариант: категория товара хранится в одном из стобцов, указываем этот столбец и парсим;
3 вариант: категории товаров сидят в строках, это наиболее распространенный вид прайсов.

Для всех 3-х вариантов я указываю в каком столбце какой атрибут товара хранится, при парсинге если в строке есть все поля которые я обозначил (нет пустых полей) и поля прошли валидацию (например цена и количество - только числа, ссылка на изображение - валидная ссылка) то значит это товар который сможем добавить. А в 3-м варианте делаю так: все строки, не прошедшие валидацию проверяются на то, содержат ли они категорию, если содержат - значит отбираем товары этой категории...

Кажись не понятно я объяснил :)
 

С.

Продвинутый новичок
Так и XML форматы тогда можно аналогично расписать.
 

Эд!

Новичок
Так и XML форматы тогда можно аналогично расписать.
У меня есть примеры прайсов XML у которых до того разная структура, что здесь можно убить кучу времени в никуда, вот посмотри:

Есть такой:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE yml_catalog SYSTEM "http://www.prof.ru/shops.dtd">
<yml_catalog date="2014-11-17 14:08">

<shop>
<name>Prof.ru</name>
<company>ООО "ГРИФФ"</company>
<url>http://www.prof.ru/</url>

<currencies>
<currency id="RUR" rate="1"/>
</currencies>

<categories>
<category id="68" parentId="67">Ножи</category>
<category id="69" parentId="67">Ручка для напильника</category>
</categories>

<offers>

<offer id="005986" available="true">
<url>http://www.prof.ru/trade/item-info.view/005986_28</url>
<price>27.80</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<delivery>true</delivery>
<name>Круг зачистной арм. 115х 6х22мм (тип 27) (Луга)</name>
<description>{вес упаковки - 11.5кг}</description>
<local_delivery_cost>1000</local_delivery_cost>
</offer>
..........


Есть такой (здесь тег parfume - это категория товара):
<?xml version="1.0"?>
-<price>
<header>Прайс-лист парфюмерии и косметики компании Элит-Галанд</header>
<company>Элит-Галанд</company>
<url>http://www.elite-cosmetics.ru</url>
<date>15.11.2014</date>
<time>19:36</time>

-<parfume>

-<item>
<namecat> Товарно-транстпортная упаковка для отправки</namecat>
<tovar_id>30538</tovar_id>
<tovar_name>Упаковка в мешок с пломбой</tovar_name>
<price>86</price>
</item>

-<item>
<namecat>12 Parfumerurs Francais</namecat>
<tovar_id>41802</tovar_id>
<tovar_name>12 PARFUMEURS INTRIGUE DE L`AMOUR lady 100ml edp ref. EP1122897</tovar_name>
<price>10965</price>
</item>
..............


Был еще у меня файл где вообще построили иерархию каталога, вложенные категории, в каждой свои товары, кошмар какойто...
Даже если все это разнести по строкам - получается бред полный...
 

AnrDaemon

Продвинутый новичок
Знаешь, есть два решения твоей проблемы с XML.
1. Писать импорт из всего, что тебе дают.
2. Сказать давальщикам, в каком формате ты принимаешь документы.
 

Фанат

oncle terrible
Команда форума
День добрый!
Подскажите может есть ли уже какой универсальный (либо легко кастомизируемый) парсер xml прайсов, я вижу это так: указываем "синонимы" тегов (расписываем что значит каждый тег в xml) и парсер все парсит ?
Есть. Называется xpath.
Собственно, твоё "указыаем" - это и есть получение xpath выражения для получения нужного поля.
потом просто применяешь это выражение при парсинге.
 

AnrDaemon

Продвинутый новичок
Кстати, да. Что-то я туплю. Если исходный формат XML, никто не запрещает преобразовать его к какому-то единому съедобному.
 

Фанат

oncle terrible
Команда форума
Кстати, да. Что-то я туплю. Если исходный формат XML, никто не запрещает преобразовать его к какому-то единому съедобному.
Это как? Ну то есть это возможно, но избыточно. После получения данных нужной структуры их надо сразу использовать, а не сохранять в новый файл и парсить заново
 

AnrDaemon

Продвинутый новичок
Это xpath. Это не избыточно. Вместо написания парсера 100500 форматов, пишешь парсер одного (соответствующего твоей схеме хранения), а входящие документы преобразуешь в этот формат. Второй урок XML (давно было, забыл. Хотя за отмазу не катит).
 

Фанат

oncle terrible
Команда форума
входящие документы преобразуешь в этот формат
Собственно, в этом и вопрос.

Вот твой xml -
Код:
<param1>stolichnaya</param1>
<param2>0.5</param2>
<param3>Tribuharika</param3>
Вот пришедший
Код:
<param4>0.7</param4>
<param5>Grimbooze</param5>
<param6>moskovskaya</param6>
go on, покажи мне хпаф который преобразует сам второе к первому.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я всегда думал, что xpath - это для поиска селекторов, а для трансформации нужен xslt...
 
  • Like
Реакции: WMix

AnrDaemon

Продвинутый новичок
Да, для трансформации нужен XSLT. Но он работает не на траве и грибах, а на тех самых xpath. Ты используешь XPath для указания "откуда брать" и "куда вставлять".
 

Фанат

oncle terrible
Команда форума
Да, для трансформации нужен XSLT.
А трансформация нужна только в твоем воображении.
Вы тут уже битый час базарите на очень умные, но совершенно нерелевантные темы.

Чуваку не нужны преобразования. Ему нужно просто прочитать.
ОН ГОТОВ руками проставлять соответствия.
Все что ему нужно было - это механизм, который соответствия задаёт.

А вас унесло в какую-то непонятную степь.
 

AnrDaemon

Продвинутый новичок
Не надо перекладывать с одной больной головы на другую. Я перечислил варианты, а понесло тут если только вас.
 
Сверху