RSS, hoje me perguntaram “o que é isso?”
Eu sei o que é, porém na hora me faltaram palavras para explicar, especialmente palavras que um não-programador consiga absorver de forma a compreender o conceito e seus melhores usos. Portanto com essa série de posts, não sei quantos nem se vou escrever na ordem, mas garanto que vou tentar cobrir tudo.
De acodo com o wikipedia: RSS – é um sub dialeto de XML que serve para agregar conteúdo.
E ai? você pergunta, ou WTF! alguns exclamam… Vamos por partes.
Dialeto de XML apenas significa que ele utiliza a estrutura de um arquivo XML, conhecido como uma “lingua” global, ou um formato de troca de mensagens padrão, muito utilizado.
Ok, isso não lhe interessa nem um pouco? Então você não é desenvolvedor, vou explicar para que serve, já se você for desenvolvedor, continue lendo depois para conhecer um pouco mais de como iniciar a vida do RSS.
O RSS é a língua falada pelos “feeds”, que são como resumos de um site (RSS – Rich Site Summary), ele lhe envia dados resumidos (titulo, descrição e link) de conteúdos de um site. Por exemplo, no ComuniWEB, site de notícias regionais de Brasília/DF onde trabalho, o feed RSS me fornece com as chamadas das últimas notícias publicadas no site, desta forma eu consigo com meu “leitor de RSS” visualizar as ultimas chamadas, e caso alguma me chame atenção clicko nela e sou levado a matéria na integra no ComuniWEB.
Veja um exemplo disso na lateral deste site, aqui do lado direito onde diz “ComuniWeb – Últimas”. Esta seção do meu blog lê o feed RSS e lista as últimas 5 notícias dele.
Agora você compreende um pouco mais do que é um RSS Feed, vá brincar um pouco, ache um leitor de RSS, como o Google Reader, e teste alguns feeds, você também pode adicionar eles à suas paginas pessoais, como o MyYahoo.
Então, você é desenvolvedor, tem um blog, um site de noticias, ou algo que você tem conteúdo que deseja compartilhar? Quer saber como fazer isso? Eu mostro o caminho. No post de hoje vou abordar o básico do básico, como criar um arquivo XML a partir de dados no PHP. No próximo post explicarei a estrutura de um arquivo RSS e depois como ler um arquivo direto no PHP.
Primeiro Passo:
Compatibilidade XML no PHP
O PHP possui algumas soluções para ler ou escrever XML, desde escrever tudo na mão até objeto sólido chamado DOM. Minha recomendação é o DOM, pois é estável e tem uma estrutura muito lógica e simples, uma vez que você a entende.
Vamos criar um XML com a seguinte estrutura:
< ?xml version="1.0" encoding="utf-8"?> <noticias> <item id="162696"> <title>Doença já matou 33 pessoas no Maranhão</title> <link>index.php?idpaginas=20&idmaterias=162696</link> </item> </noticias>
Primeiro temos que criar um novo documento XML pelo DOM.
$xmlDoc = new DOMDocument('1.0', 'utf-8'); $xmlDoc->formatOutput = true;
Agora a variável $xmlDoc agora contêm um objeto DOM (Document Object Model) e este foi instruido a formatar a sua saída de forma “arrumadinha” pelo método “formatOutput“. Em seguinda vamos adicionar o elementos raís, neste caso chamado de “noticias”, observe:
$noticias = $xmlDoc->createElement('noticias'); $noticias = $xmlDoc->appendChild($noticias);
Na primeira linha criamos a partir do documento principal ($xmlDoc) um elemento chamado notícias, sem conteúdo. Em seguida na segunda linha mostramos ao documento principal, onde adicionar este elemento, e atualizamos a variavel $noticias com o objeto já inserido em seu local.
Agora precisamos criar um elemento “item” que possui um atributo “id”, observe:
$item = $xmlDoc->createElement('item'); $item->setAttribute('id','162696'); $item = $noticias->appendChild($item);
Mais uma vez criamos o elemento, neste caso “item”, sempre a partir do documento raíz. Em seguida “setamos” um atributo, dando e ele um nome e um valor, de acordo com o exemplo acima. Na linha seguinte ligamos o “filho” ao pai, porém note que desta vez nao utilizamos o documento principal, e sim o objeto $noticias, ou seja, o elemento $item será adicionado abaixo (dentro, hierarquia) do elemento $noticias já cadastrado.
Agora devemos adicionar os itens Title e Link a este elemento $item para finalizar nosso processo de adição, porém aqui teremos uma leve mudança:
$title = $xmlDoc->createElement('title',utf8_encode('Doença já matou 33 pessoas no Maranhão')); $title = $item->appendChild($title); $link = $xmlDoc->createElement('link',htmlentities('index.php?idpaginas=20&idmaterias=162696')); $link = $item->appendChild($link);
Observe o uso normal da criação e elementos e a ligação destes dois ao objeto $item, formando a hierarquia do exemplo. Porém no momento que adicionamos os valores devemos ter dois cuidados:
1 – Converter caracteres “latinos” – como çãá – para UTF-8, pois escolhemos este charset (pode-se usar ISO-XXXX, porém muitos leitores de XML ainda se confundem), isto é feito no exemplo com a função utf8_encode();
2 – Converter entidades HTML, no XML o caracter & significa entidade, com isso se ele aprecer perdido no texto podemos ter problemas, convertido em & amp; o XML o interpreta como deve.
Pronto, agora resta finalizar e jogar para a tela:
header("Content-type:application/xml; charset=utf-8"); echo $xmlDoc->saveXML();
Primeiro encaminhamos um header para garantir a interpretação pelo browser e depois damos um echo no resultado da função saveXML que pode ou jogar o resultado em uma string ou salvá-la em um arquivo.
Veja o script completo abaixo, ou veja ele funcionando aqui: Live demo
< ? $xmlDoc = new DOMDocument('1.0', 'utf-8'); $xmlDoc->formatOutput = true; $noticias = $xmlDoc->createElement('noticias'); $noticias = $xmlDoc->appendChild($noticias); $item = $xmlDoc->createElement('item'); $item->setAttribute('id','162696'); $item = $noticias->appendChild($item); $title = $xmlDoc->createElement('title',utf8_encode('Doença já matou 33 pessoas no Maranhão')); $title = $item->appendChild($title); $link = $xmlDoc->createElement('link',htmlentities('index.php?idpaginas=20&idmaterias=162696')); $link = $item->appendChild($link); header("Content-type:application/xml; charset=utf-8"); echo $xmlDoc->saveXML(); ?>
Portanto termino por aqui a primera parte desta apresentação de o que é um RSS. Espero já ter ajudado com algumas dúvidas de XML e DOM, porque sei que muitos têm. No próximo artigo eu falarei um pouco mais da especificação RSS e sua evolução do 0.91 até o 2.0 conhecida agora como Really Simple Syndication.
This post is also available in: Inglês
Ola Rafael, muito bom seu artigo, bem simplificado e facil de entender, essa biblioteca DOM é muito poderosa heim.
Realmente é dificil explicar para pessoas leigas as vantagens de se usar certas tecnologias.
ate mais
Leonardo França
Legal!
Entendi um pouco de RSS ^^
Opa muito boa a explicação;
Eu so tenho uma duvida com relação ao uso do Dom.
Como eu faço para carregar um arquivo de xml e apos isso adicionar um novo conteudo a ele?
Porque sempre que eu tento com
$dom->save(“arquivo.xml”);
Ele substitui o conteudo.
E eu quero incrementa-lo;
Vlw;
Ricardo,
Se entendi o que você deseja fazer, você quer adicionar dados no final de um XML, certo?
Pra isso realmente você precisa carregar o documento todo no PHP, adicionar os nodes novos e salvar o arquivo novamente por cima do antigo, não existe um append direto no arquivo até onde conheco.
abraço
Olá! Parabéns pelo artigo, tem me ajudado bastante (como todos os outros publicados aqui).
Mas tenho uma dúvida! Me baseei no script que você publicou e tenho tido problemas na hora de gerar o xml… Sempre aparece “Erro no processamento de XML: declaração xml não está no início da entidade externa
Posição: http://dominio.com/rss/rss.php
Número da linha 2, Coluna 1:”
Já tentei eliminar todos as linhas e espaços em branco no script e até trocar o lugar de chamada do header, mas não funcionou.
Iria ficar muito grato se pudesse me ajudar!
Abraços e parabéns novamente!
Henrique,
que bom que pude ajudar e obrigado pelo feedback. Encontrei este erro recentemente em um script, porém nao lembro agora o que era nem como resolver.
Lembro que era algo devido às declarações do XML que deve estar presente em feeds que seguem o formato padrão.
Me envie por email algum link ou código fonte do seu script para que eu possa analisar com mais cuidado.
Abraço!
Rafael, muito obrigado pela resposta tão rápida.
Segue abaixo o código-fonte:
formatOutput = true;
$xmlRSS = $xmlDoc->createElement(“rss”);
$xmlRSS ->setAttribute(“version”,”2.0″);
$xmlRSS = $xmlDoc->appendChild($xmlRSS);
$xmlChannel = $xmlDoc->createElement(“channel”);
$xmlChannel = $xmlRSS->appendChild($xmlChannel);
$xmlCanalTitle = $xmlDoc->createElement(‘title’,”teste”);
$xmlCanalDescription = $xmlDoc->createElement(‘description’,”teste”);
$xmlCanalLink = $xmlDoc->createElement(‘link’,’http://www.teste.com’);
$xmlCanalTitle = $xmlChannel->appendChild($xmlCanalTitle);
$xmlCanalDescription = $xmlChannel->appendChild($xmlCanalDescription);
$xmlCanalLink = $xmlChannel->appendChild($xmlCanalLink);
foreach ($noticias as $t){
$xmlItem = $xmlDoc->createElement(‘item’);
$xmlItem = $xmlChannel->appendChild($xmlItem);
$xmlNewsId = $xmlDoc->createElement(‘guid’,$t[‘id’]);
$xmlNewsTitulo = $xmlDoc->createElement(‘title’,xmlSafeText($t[‘titulo’]));
$xmlNewsLink = $xmlDoc->createElement(‘link’,$t[‘link’]);
$xmlNewsData = $xmlDoc->createElement(‘pubDate’,date(‘r’,strtotime($t[‘data’])));
$xmlNewsId = $xmlItem->appendChild($xmlNewsId);
$xmlNewsTitulo = $xmlItem->appendChild($xmlNewsTitulo);
$xmlNewsLink = $xmlItem->appendChild($xmlNewsLink);
$xmlNewsData = $xmlItem->appendChild($xmlNewsData);
}
header(“Content-type:application/xml; charset=utf-8”);
echo $xmlDoc->saveXML();
?>
Parabéns pelo artigo e que o seu sucesso esteja sempre a disposição das pessoas afim de que as ajude, com sua experiência.
Estou com um pequeno problema e ao verificar minha dúvida na rede, encontrei este seu material e uma pessoa que teve o mesmo problema.
Possuo uma pequena aplicação que tenho que gerar uma resposta em xml. Como utilizo o Mozilla Firefox o mesmo de gera um erro, a saber:
“O documento XML não está associado a estilos. A estrutura do documento é representada abaixo”.
Gerando assim a resposta em xml.
Como resolver este problema?
Mas quando utilizo o , utilizando o Mozilla o mesmo gera o seguinte erro:
“Erro no processamento de XML: declaração xml não está no início da entidade externa”
Posição:http://192.168.1.248:8080/webservice/ClientMachines.jsp?cid=A744A62E7F51C70788D22FA9ED6E1571
Número da linha 4,Coluna: 1
0002550F228439D437DA1553ADM-113631001143FCC0AEDB33993F151BFILE-SERVER00023F90BE9C00000221515FJANUS2B0C6E172A762B590E981556LANDSRAADAB0C6E172A76AB590E981556LANDSRAAD150C6E172A7615590E981556LANDSRAAD0B0C6E172A760B590E981556LANDSRAADE70C6E172A76E7590E981556LANDSRAADA10C6E172A76A1590E981556LANDSRAADB70C6E172A76B7590E981556LANDSRAADBF0C6E172A76BF590E981556LANDSRAAD8F0C6E172A768F590E981556LANDSRAAD990C6E172A7699590E981556LANDSRAADAD0C6E172A76AD590E981556LANDSRAADC90C6E172A76C9590E981556LANDSRAADC10C6E172A76C1590E981556LANDSRAADCB0C6E172A76CB590E981556LANDSRAAD0010605C76A7D44FB75C155FT-SATELLITE000347202AA576191F2A1504TIAZINHA0007E9F66825E7F0A81C1500W2003QA0003FFF5019C5011BB7B1521WIN2000003FF8245467C33DF931529WIN200-BR-VP0003FFF400819071ACC01521WIN2K-VPC-CRP0003FF8B4546F52C3820150FWIN2K3-IP80003FF734876B15A42ED251EWIN95OSR2_SHIGU0003FFFDFFFFCC3DE2922506WIN95OSR2_V_VPD0003FF70487668862D5E2528WIN98SE_EN_VP0003FFF4019C68862D5E2529WIN98SE_EN_VP0003FF744876995518FD2508WIN98SE_SHIGU0003FF7748765F8E2F461547WINNT4SP4_SHIGU000EA600AE53595D5E90154FWROMULO000244091DC1B31C95C01511WTESTENTWORK000802044218F5E1F6741521WXPBALMEIDA
^
A mesma aplicação é compilada no Internet Explorer e a única diferença é que
o cabeçalho da página é gerada com o e a outra não. Ou seja, não gera nenhum erro. Porque será que só gera erro no Mozilla?
Um abraço e muito obrigado por sua ajuda.
Para ajudar segue classe .java e .jsp:
import java.sql.Connection;
import automatos.site.desktop.MachineId;
import automatos.site.util.DatabaseProvider;
public class WSMachines
{
public String getMachines (String cid)
{
//String xml=””;
String xml = “”;
Connection con = null;
try
{
con = DatabaseProvider.getAsset();
java.util.Vector vMachines = MachineId.recuperaTodasPeloCid(con, cid);
xml = toXML(vMachines);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
DatabaseProvider.returnAsset(con);
}
return xml;
}
public String toXML (java.util.Vector machines) throws Exception
{
//String xml=””;
String xml=””;
xml += “”;
if (machines != null)
{
for (int i = 0; i “;
xml += “” + machineId.getMachineId() + “”;
xml += “” + machineId.getMachineHostName() + “”;
xml += “”;
}
}
xml += “”;
System.out.println(“xml: ” + xml);
return xml;
}
}
Parabéns pelo artigo. Tirou várias dúvidas que eu tinha.
Um artigo que mostrasse como fazer buscas em um arquivo xml também seria de grande ajuda.
Valew
Arthur,
Obrigado, e bela dica, vou escrever um artigo sobre XPath e técnicas de busca em XML
Abraço
O meu erro é a seguinte linha após executá-lo em um servidor na web:
Fatal error: Cannot instantiate non-existent class: domdocument in /home/usuario/www/criaXML.php on line 24
Está dizendo que não posso instanciar uma classe inexistente.
Esta classe já não deveria por padrão existir?
O phpinfo informa isso para as configurações de xml:
xml
XML Support active
XML Namespace Support active
EXPAT Version expat_1.95.8
xmlrpc
core library version xmlrpc-epi v. 0.51
php extension version 0.51
author Dan Libby
homepage http://xmlrpc-epi.sourceforge.net
open sourced by Epinions.com
********************************************
Agradeço desde já pela ajuda e espero em breve estar contribuindo também…
Um abraço a todos!
Cássio,
Qual versão do PHP esta instalada?
Isto vale apenas para a versão 5+.
A extensão é a de DOM e não XML, estas bibliotecas acima não importam, e cuidado pois em versões anteriores do PHP existe uma classe DOMXML que é diferente e incompativel.
A versão é a 4.4.0.
Vou acabar tendo que pedir um upgrade da versão PHP do servidor para que funcione normalmente o script do exercício proposto.
Obrigado pelo feedback e vou indicar o site para amigos…
Olá rafael, tudo bem? Nossa, demais seu artigo! Gostaria de saber como faço para, a partir de uma página php que gerou esse xml, ler o conteúdo do mesmo?
Por exemplo: eu tenho uma página chamada xmlresponse.php que irá retornar os dados do usuário nessa sequencia:
Pedro
pedroernesto
E gostaria de, em php, não utilizando ajax, ler esse conteúdo. Por acaso essa biblioteca me ajudaria nessa situação?
Obrigado.
Evandro,
Com certeza, a classe SimpleXML é perfeita para fazer a leitura de um xml direto no PHP. De uma olhada na documentação dela para ver como utilizar, mas é realmente a forma mais simples e ágil de ler um XML.
Abraço!
Rafael, parabéns. O artigo é sensacional. Eu estava procurando a solução de um problema e acabei esbarrando nele. Muito bom.
Aproveitando queria lhe fazer uma pergunta. É possível adicionar um valor ao xml via dom no javascript? Meu problema é que estou procurando a forma de fazer isso e não tenho tido sucesso.
Abraço,
Rafael, meu site é 100% HTML, é possível ofecere RSS.
Caso seja, como devo fazer?
Seja muito abençoado.
Elias de Oliveira
http://www.vivos.com.br
Rafael, estou recebendo a seguinte mensagem de erro quando tento acessar meus feeds (blog criado há pouco tempo e nunca funcionou os feeds),:
Erro no processamento de XML: declaração xml ou de texto fora do início da entidade
Posição: http://www.gfsolucoes.net/wordpress/feed/
Número da linha 2, coluna 1:
^
no que puder me ajudar agradeço,
Gustavo.
Gustavo,
Isso me parece um problema de encoding, e o erro estaria justamente em algum acento ou coisa assim.
O trecho “encoding=”‘.get_option(‘blog_charset’).'”?”.”>”;”que aparece de erro ai é peo fato do PHP não estar sendo executado.
Verifique a instalação do seu blog.
abraço
Reinstalei tudo e agora está funcionando, muito obrigado pela ajuda.
[quote]
Opa muito boa a explicação;
Eu so tenho uma duvida com relação ao uso do Dom.
Como eu faço para carregar um arquivo de xml e apos isso adicionar um novo conteudo a ele?
Porque sempre que eu tento com
$dom->save(”arquivo.xml”);
Ele substitui o conteudo.
E eu quero incrementa-lo;
Vlw;
Ricardo,
Se entendi o que você deseja fazer, você quer adicionar dados no final de um XML, certo?
Pra isso realmente você precisa carregar o documento todo no PHP, adicionar os nodes novos e salvar o arquivo novamente por cima do antigo, não existe um append direto no arquivo até onde conheco.
abraço
[/quote]
Estou com a mesma dúvida do amigo, como procedo a resposta que você postou para ele…??? (carregar o documento todo no php/salvar o arquivo por cima….
Valew pelo tutorial!!!
Parabéns Rafael, muito bom o POST !!
Eu estava utilizando o PHP contruindo o XML “na mão” que encontrei em um outro tutorial, e da forma que você colocou aqui ficou muito melhor e padronizado.
A propósito.. o XML não era lido no Mozilla Firefox, dava um erro assim : “Erro no processamento de XML: declaração xml ou de texto fora do início da entidade”.
Então.. batalhei aqui algum tempo até me ligar do problema, e pra minha surpresa eram espaços em branco no início do documento. O Firefox ao contrário do IE, requisita que a tag “xml” seja a primeira do arquivo a ser lido por ele. Depois de corrigir isso, IT WORKA VERY WELL !!!
Valeu !!
Cristine, o xml é uma linguagem de marcação, portanto nao faz oeprações, procure XSLT que talvez seja possivel.