Criando um FEED com SimpleXML
Como vimos em um post post anterior com a classe SimpleXML é muito fácil de navegar um documento XML. E Hoje vamos ver como inserir novos nodos em um documento XML e para exemplificar isto vamos contruir um FEED utilizando o formato ATOM.
Para aqueles que não sabem FEEDS são utilizados para que um usuário possam saber se determinado site sofreu alguma atualização sem precisar ir até ele e verificar, o que costuma ser um sério problema para o usuário que acompanha muitos sites. Imaginamos a seguinte situação, um usuário visita 10 sites por dia para verificar se ele disponibilizou notícias novas. Se somente 5 sites disponibilizaram notícias novas o usuário perdeu 50% de seu tempo.
Então vamos a solução dada pelo FEED. O usuário visita um site que acha interessante, copia o endereço do FEED para um agregador de FEEDS. Agora basta o usuário abrir o agregador que o ele baixará o arquivo do FEED, que é um arquivo XML que contem as ultimas atualizações do site, e verficará quais o usuário já leu mostrando somente as novas.
Vamos então ao código, que é o que realmente interessa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | $doc = ''; $feed = new SimpleXMLElement($doc); //cabeçalho $feed->addChild('id'); $feed->id = "http://www.botecodigital.info"; $feed->addChild('title'); $feed->title = "Titulo do RSS"; $feed->addChild('link'); $feed->link->addAttribute('href','http://www.botecodigital.info'); $feed->addChild('update'); $feed->update = date('Y-m-d H:m'); $feed->addChild('author'); $feed->author->addChild('name'); $feed->author->name = "Rodrigo"; $feed->author->addChild('email',"blogbotecodigital_em_gmail.com"); $feed->author->addChild('uri',"http://www.botecodigital.info"); $feed->addChild('icon',"http://www.botecodigital.info/icone.ico"); $feed->addChild('logo',"http://www.botecodigital.info"); $feed->addChild('rights',"© 2008 - Boteco Digital"); $feed->addChild('subtitle',"Todo conhecimento é válido!"); $feed->addChild('categopry'); $feed->categopry->addAttribute('term','Informática'); |
Começamos nosso script criando uma variável($doc) contendo o elemento pai feed para que possamos criarmos o objeto SimpleXML como mostrado na linha 1 e 2.
Uma vez instanciado nosso objeto vamos adiconar os elementos de cabeçalho ao nosso XML. O cabeçalho ATOM exige que contenha o elemento id que identifica o FEED utilizando URL, o domínio de seu site serve. Então vamos ver como inserimos nosso id ao código, na linha 5 adicionamos um novo elemento com o método $feed->addChild(nomedoelemento) e para adicionarmos um texto dento do elemento basta atribuir um valor normalmente como $feed->nomedoelemento = “valor qualquer”.
Outro elemento exigido é o title que contem o titulo do FEED, então não se esqueça dele.
O elemento link em vez de conter um texto contem um atributo e para adicionarmos um atributo a um elemento XML utilizamos o método $feed->link->addAttribute(nomeAtributo,valorAtributo);.
O elemento author contem outros elementos dentro dele, então iremos cria-lo com o método $feed->addChild(‘author’) e adicionamos os elementos dentro dele da seguinte forma $feed->author->addChild(‘name’); entenderam? E se fossemos adicionar um elemento dentro do elemento name? Simples $feed->author->name->addChild(‘sobrenome’). Além do name o elemento author tem os elementos email e uri que adicionamos utilizando um segundo parametro no método addChild que seria o valor do elemento.
Outros elementos disponíveis são: o elemento icon (linha 27) que define um icone para o FEED, o elemento logo (linha 29) que define um logo, o elemento rights que define os diretos autorais do conteúdo do FEED, O elemento subtitle (linha 33) que define um descrição curta ou um slogan do FEED e o elemento category que contem o atributo term que define a categoria em que se encaixa o FEED.
Certo, agora que já temos o cabeçalho do nosso FEED vamos começar a inserir as entradas das atualizações, no nosso exemplo um post do site.
1 2 3 4 5 6 7 8 9 | $feed->addChild('entry'); $feed->entry[0]->addChild('title',"CSS Sprite"); $feed->entry[0]->addChild('link'); $feed->entry[0]->link->addAttribute('href',"http://www.botecodigital.info/2008/06/css-sprite.html"); $feed->entry[0]->addChild('id','http://www.botecodigital.info/2008/06/css-sprite.html'); $feed->entry[0]->addChild('updated','2008-06-27'); $feed->entry[0]->addChild('summary','CSS Sprite - Movendo imagens na págica com CSS '); $feed->entry[0]->addChild('author'); $feed->entry[0]->author->addChild('name','Rodrigo'); |
Como podemos o elemento entry define uma entrada de uma atualização, e dentro deste elemento temos os elementos: title (linha 2) o titulo do post, o elemento link(linha 3) que contem o atributo href(linha 4) que é o URL do post, o elemento id (linha 5) que também podemos utilizar o URL do post, o elemento updated (linha 6) a data em que o post foi atualizado, o elemento summary (linha 7) que seria um pequeno resumo do post e para finalizar o elemento author (linha 8 ) que contem o elemento name que contem o nome do autor do post.
Como podemos notar, quando utilizamos o elemento entry utilizamos o índice [0] pois este elemento vai se repetir várias vezes, uma para cada atualização. É claro que você não vai adiconar cada atualização a mão não é? Basta colocar o trecho de código acima em um loop buscando os valores do banco de dados e temos um FEED prontinho para usar.Agora para gerar o XML usamos o método $feed->asXML(); que retorna uma string com nosso XML pronto.
Se você deseja baixar o nosso exemplo clique aqui.
Por hoje era isso e lembrem-se, assinem meu FEED
[UPDATE] Estive com um problema criando um FEED essa semana e o Feed Validation Service ajudou bastante, então fica a dica.

Atualmente existe 1 Comentário
Excelente post, merece palmas de pé! ^^
Parabens pela vontade de compartilhar informações e experiencias! Continue assim! ^^
Às vezes não temos o retorno que esperamos, mas um dia o retorno aparece (nem que seja no céu… rs)
Obrigado!