RSS feedek kategóriáinak és fájljainak feldolgozása Feeds modullal

Novák Áron küldte be 2012. 05. 26., szo - 14:45 időpontban

Nemrégiben volt egy olyan apró feladatom, hogy két Drupal oldal között kellett tartalmat átvinni, körülbelül úgy, ahogy a drupal.hu-ra eljut ez a bejegyzés is, egy RSS csatornán keresztül. Egy Views-zel generált RSS csatorna (meg volt sminkelve meg a szűrők miatt is praktikus volt views-zel) volt a forrás, a másik oldalon pedig a Feeds a Common Syndication parser-rel feldolgozta és legyártotta belőle a node-okat. Triviális is volt minden egészen addig, amíg meg nem kérdezték, hogy ugyan a címkéket nem lehetne-e átvinni, mégpedig úgy, hogy az egyes taxonomy tag-ek s nekik megfelelő vocabulary-kba kerüljenek. Bizony ez a parser egyszerűen egy listát ad a tagekről, függetlenül attól, hogy milyen vocabulary-ben vannak. De hogy is van jelen ez az információ az XML struktúrában?
Hát így:

Tag1
Tag2

A domain attribútum nem kerül feldolgozásra. A megoldás az volt, hogy a Feeds XPath Parser-ére váltottam át. Ennek az a lényege, hogy az XPath egy nagyon rugalmas nyelv arra, hogy egy XML dokumentum (az RSS feed is pont az) különböző részeit elérjük és kinyerjük. Ez esetben Feeds szinten arról van szó, hogy XPath-kifejezésekkel meg tudjuk írni a saját parser-ünket. Minden mapping target-hez felvehetünk egy üres XPath Expression-t, amiket specifikálva működésre tudjuk bírni a rendszert. Mit is kellett beállítanom ahhoz, hogy fel tudjam dolgozni az ominózus hírcsatornát?

CímkeXPath-kifejezés
context/rss/channel/item
body./description
title./title
guid./guid
voc1./category[contains(@domain, "/category/vocab1")]
voc2./category[contains(@domain, "/category/vocab2")]
field_file./enclosure/@url

S már működik is! Rövid kommentárként annyi, hogy a context kifejezés által visszaadott elemek halmaza az a hírcsatorna-elemek halmaza, látjuk, hogy az item-et választjuk ki az rss csatornán belül. A parser végigmegy az összes item-en (a megadott szintjén a struktúrának) és feldolgozza rá a további kifejezéseket, amik lentebb találhatóak. Ami elsőre megtévesztő volt nekem, hogy nem láttam sehol ledokumentálva, hogy / helyett ./ -vel kezdjem a kifejezést, ha az elembeli kontextuson belül akarok keresni, de néhány példa-kifejezés megtekintése után erre is sikerül rájönni. S valamint láthatjátok, hogy bónuszként ott van, hogy hogyan kell enclosure-ban megadott URL-ek et mappelni, ezt praktikusan fájlok lementésére tudjuk használni, ahol is a target egy CCK Filefield (ez egy D6-os projekt volt, de minden érvényes 7-re is lényegében)
A táblázatbeli beállításokat az importer beállító-oldalán tudjunk megtenni, az admin/build/feeds/edit/[importer-név]/settings/FeedsXPathParserXML oldalon azután, hogy az admin/build/feeds/edit/[importer-név]/mapping oldalon hozzáadtuk az XPath Expression -> Field társításokat.

Az XPath-ról a W3Schools oldalán van egy egész jó útmutató angol nyelven. Magyar nyelven egy BME-s tárgy hallgatói segédletében tudok egy tömör összefoglalóról. Az XPath-ismeretek amúgy is nagyon hasznosak, az Inovae-nél Selenium tesztek gyártásához már nagy hasznát vettem.