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.