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 construir 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 verificará quais o usuário já leu mostrando somente as novas.
Vamos então ao código, que é o que realmente interessa:
$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 adicionar 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 parâmetro no método addChild
que seria o valor do elemento.
Outros elementos disponíveis são: o elemento icon (linha 27) que define um ícone 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.
$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 adicionar 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.