xPath и парсинг xml

Аватар пользователя nnelitse nnelitse 8 ноября в 13:54

Здравствуйте, Друзья. Есть документ xml, который нужно спарсить. Вроде все легко, установил feeds, xPath Feeds и парсишь... Но столкнулся с проблемой. Вот сам xml документ:

<?xml version="1.0" encoding="cp1251"?><!DOCTYPE yml_catalog SYSTEM "shops.dtd">
            <yml_catalog date="2019-11-04 11:40">
        <shop><name>Магазин Обуви!</name>
<company>Магазин Обуви!</company>
<url>https://respect-shoes.ru</url>
<platform>1C-Bitrix</platform>
<currencies>
<currency id="RUB" rate="1"/>
</currencies>
<categories>
<category id="586">Мужчинам</category>
<category id="587" parentId="586">Мужская обувь</category>
<category id="595" parentId="587">Ботинки</category>
<category id="937" parentId="587">Дутики</category>
<category id="604" parentId="587">Кеды</category>
<category id="600" parentId="587">Кроссовки</category>
<category id="894" parentId="587">Лоферы</category>
<category id="589" parentId="587">Мокасины</category>
<category id="605" parentId="587">Пантолеты</category>
<category id="588" parentId="587">Полуботинки</category>
<category id="590" parentId="587">Сандалии</category>
<category id="608" parentId="587">Слипоны</category>
<category id="896" parentId="587">Угги</category>
<category id="816" parentId="587">Эспадрильи</category>
<category id="910" parentId="586">Сумки</category>
<category id="911" parentId="910">Сумки</category>
<category id="906" parentId="586">Аксессуары</category>
<category id="907" parentId="906">Головные уборы</category>
<category id="920" parentId="906">Зонты</category>
<category id="925" parentId="906">Очки</category>
<category id="924" parentId="906">Перчатки и варежки</category>
<category id="914" parentId="906">Ремни</category>
<category id="915" parentId="906">Шарфы и платки</category>
<category id="592">Женщинам</category>
<category id="593" parentId="592">Женская обувь</category>
<category id="609" parentId="593">Балетки</category>
<category id="596" parentId="593">Босоножки</category>
<category id="602" parentId="593">Ботильоны</category>
<category id="792" parentId="593">Ботинки</category>
<category id="607" parentId="593">Ботфорты</category>
<category id="843" parentId="593">Дутики</category>
<category id="806" parentId="593">Кеды</category>
<category id="807" parentId="593">Кроссовки</category>
<category id="611" parentId="593">Лоферы</category>
<category id="805" parentId="593">Мокасины</category>
<category id="898" parentId="593">Мюли</category>
<category id="813" parentId="593">Пантолеты</category>
<category id="812" parentId="593">Полуботинки</category>
<category id="603" parentId="593">Полусапоги</category>
<category id="899" parentId="593">Резиновая обувь</category>
<category id="804" parentId="593">Сабо</category>
<category id="808" parentId="593">Сандалии</category>
<category id="601" parentId="593">Сапоги</category>
<category id="810" parentId="593">Слипоны</category>
<category id="895" parentId="593">Туфли </category>
<category id="616" parentId="593">Угги</category>
<category id="613" parentId="593">Эспадрильи</category>
<category id="912" parentId="592">Сумки</category>
<category id="922" parentId="912">Клатчи</category>
<category id="919" parentId="912">Рюкзаки</category>
<category id="913" parentId="912">Сумки</category>
<category id="908" parentId="592">Аксессуары</category>
<category id="945" parentId="908">Бижутерия</category>
<category id="916" parentId="908">Головные уборы</category>
<category id="921" parentId="908">Зонты</category>
<category id="932" parentId="908">Кошельки</category>
<category id="918" parentId="908">Очки</category>
<category id="923" parentId="908">Перчатки и варежки</category>
<category id="909" parentId="908">Ремни</category>
<category id="917" parentId="908">Шарфы и платки</category>
</categories>
<offers><offer available="true" id="198497"><categoryId>921</categoryId><currencyId>RUB</currencyId><model>Зонт</model><modified_time>1552454526</modified_time><name>Зонт</name><param name="Цвет">цветн.</param><pickup>true</pickup><picture>https://respect-shoes.ru/upload/iblock/5dd/5ddf6bfb1d3e4aa752f3ce7ee3320...
<offer available="true" id="198128"><categoryId>921</categoryId><currencyId>RUB</currencyId><model>Зонт</model><modified_time>1552454526</modified_time><name>Зонт</name><param name="Цвет">цветн.</param><pickup>true</pickup><picture>https://respect-shoes.ru/upload/iblock/bdd/bdd984b962e4b7d8c7ed84b8be863...
<offer available="true" id="198300"><categoryId>921</categoryId><currencyId>RUB</currencyId><model>Зонт</model><modified_time>1552454526</modified_time><name>Зонт</name><param name="Цвет">цветн.</param><pickup>true</pickup><picture>https://respect-shoes.ru/upload/iblock/1f8/1f8440c73ecd337ce68666dca4af3...
<offer available="true" id="198545"><categoryId>921</categoryId><currencyId>RUB</currencyId><model>Зонт</model><modified_time>1552454526</modified_time><name>Зонт</name><param name="Цвет">цветн.</param><pickup>true</pickup><picture>https://respect-shoes.ru/upload/iblock/ace/ace9ce720736e486944c555509852...
<offer available="true" id="198809"><categoryId>921</categoryId><currencyId>RUB</currencyId><model>Зонт</model><modified_time>1552454526</modified_time><name>Зонт</name><param name="Цвет">цветн.</param><pickup>true</pickup><picture>https://respect-shoes.ru/upload/iblock/b07/b075b54d4fad63485c80b8a85c7a8...
<offer available="true" id="199148"><categoryId>921</categoryId><currencyId>RUB</currencyId><model>Зонт</model><modified_time>1552454526</modified_time><name>Зонт</name><param name="Цвет">цветн.</param><pickup>true</pickup><picture>https://respect-shoes.ru/upload/iblock/eab/eab840d31ef5228b37f703b90a184...

...
И так далее.
Дело в том, что категории товаров распределены по id и расположены на блоком наверху, это бы все ничего, думал можно решить это с помощью Tamper - Find replace (если я делаю неправильно, можете подсказать правильный путь). В информации о товарах есть только id категории, но дело в том, что каждый термин имеет еще и родительский термин, который в информации о товаре не указан. Как можно решить эту проблему? Есть у кого-то идеи? Буду рад любой помощи и подсказке) Заранее спасибо

0 Thanks

Лучший ответ

Аватар пользователя nnelitse nnelitse 9 ноября в 16:35

Вдруг, кому-то понадобится. Решил проблему так:
1. Вручную создал термины таксономии (позиций было не много, поэтому сделал вручную, возможно есть вариант сделать это программно с сохранением иерархии, но я даже искать не стал)
2. В Tamper Feeds выбрал Find and replace и каждому внешнему id термина, прописал внутренний id.

3.Срарсил id категорий с Feeds xPath

Решено. Спасибо @bumble и @Orion76 за наводку про внешний id.

Комментарии

Аватар пользователя bumble bumble 8 ноября в 14:53

Грубо говоря, флоу должен быть приблизительно следующим:

  • (только если нужно) - Парсинг магазинов.
  • (только если нужно) - Парсинг служебной информации (компании, названия...).
  • Парсинг валют. Вероятно, потребуется некое поле для сопоставления ID из файла и внутреннего.
  • Парсинг категорий (для категорий, в Друпал, принято использовать таксономию; там и родительский термин можно устанавливать, для воспроизведения иерархии). Тоже нужен механизм соответствий ID'шников.
  • Парсинг предложений. (вот тут и понадобится сопоставляющее поле из предыдущего шага, для определения присваиваемой категорий).

Это вне контекста, фидсом - не знаю можно ли добиться подобного.

Аватар пользователя nnelitse nnelitse 8 ноября в 15:26

Все пункты, кроме парсинг категорий, уже сделаны. Возможностей фидс хватило с головой. Вот сопастовление айдишников - тут проблему есть... В таксономии уже существуют термины с такими айди. Там до 1000 уже все заполнено. Вот меня интересует как быть с парсингом категорий. Пока ничего в голову не приходит

Аватар пользователя bumble bumble 8 ноября в 15:27

Добавьте поле внешнего ID категории, в него пишите, по нему ищите, а используйте нативный.

Аватар пользователя nnelitse nnelitse 8 ноября в 15:29

Думал об этом, но тут есть подводные камни, во первых Feeds может искать термин либо только по tid, либо только по имени, по остальным полям увы, не умеет.
Второй вопрос - как быть тогда с родительский термином?

Аватар пользователя Orion76 Orion76 8 ноября в 16:21

Насколько помню, feeds и migrate по принципу работы не сильно отличаются .

У обоих есть специальная таблица для хранения связи "внешнего" и "внутреннего" ID сущности.

В migrate такой проблемы нет.
Просто в конфиге миграции указываешь, что например поле товара "категория"(в xml-файле) это внешний ID категории из миграции "категории".

Все, по этому внешнему ID из таблицы связей внешних-внутренних айдишников ищется внутренний ID(tid термина категории) и подставляется в поле "категория" импортируемой сущности "товар".

Скорее всего в Feeds такое тоже как-то должно работать.

Аватар пользователя nnelitse nnelitse 8 ноября в 17:03

Я правильно понимаю, что достаточно создать ещё одной поле в термина таксономии "ID"?
Не подскажете, как связать внешний Id с внутренним? Все таки они же разные будут. Пока даже теоритически не представляю как это сделать

Аватар пользователя nnelitse nnelitse 8 ноября в 17:00

Пока все, что придумал, это переопределять айди категорий вместе с родителем и разделять с помощью tamper

Аватар пользователя nnelitse nnelitse 9 ноября в 16:35

Вдруг, кому-то понадобится. Решил проблему так:
1. Вручную создал термины таксономии (позиций было не много, поэтому сделал вручную, возможно есть вариант сделать это программно с сохранением иерархии, но я даже искать не стал)
2. В Tamper Feeds выбрал Find and replace и каждому внешнему id термина, прописал внутренний id.

3.Срарсил id категорий с Feeds xPath

Решено. Спасибо @bumble и @Orion76 за наводку про внешний id.