0

Lendo arquivo XML(RSS) com PHP

criado por Leandro Maniezo em 16/12/2004 6:54am
No exemplo abaixo vou fazer uma leitura em um arquivo xml de RSS, segue a estrutura desse arquivo:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
 
<rss version="2.0">
         
<channel>
               
<title></title>
               
<link></link>
               
<description></description>
               
<language></language>
               
<copyright></copyright>
       
<image>
               
<title></title>
               
<url></url>
               
<link><link>
       
</image>
       
<lastBuildDate></lastBuildDate>
       
<ttl></ttl>
   
       
<item>
               
<title></title>
               
<link></link>
               
<description></description>
               
<datePosted />
       
</item>
    .
        .
        .
 
</channel>
 
</rss>

Para ler um xml é necessario criar um parser, no qual sera usado em cada função para receber os paramentos do xml que esta sendo lido.

Para criar um parser utilizamos a função:
xml_parser_create()

Funções que trazem as tags do xml <></>:
xml_set_element_handler()

Função que trazer os dados do xml <>dados</>.
xml_set_character_data_handler()

Com essas funções criei uma classe para leitura:

<?php

class le_xml{
   
   
var $parser;
       
   
function le_xml() {  
        $this
->parser = xml_parser_create();
        xml_set_element_handler
($this->parser, "tags_ini", "tags_fim");
        xml_set_character_data_handler
($this->parser, "dados");
   
}

     
   
function abre_xml($url){
       
// Função que pega a tag aberta xml <>
       
function tags_ini($parser, $param) {
           
switch($param) {
               
case "TITLE":
                    echo
"<br><table width=100%>";
                    echo
"<tr bgcolor=#c7c7c7><td align=left>";
                    echo
"<font face=Arial size=2><u>Titulo:</u> ";
               
break;
               
case "URL":                      
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Url logo: ";
               
break;
               
case "LANGUAGE":
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Linguagem: ";
               
break;
               
case "COPYRIGHT":
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Copyright: ";
               
break;
               
case "TTL":
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Tamanho letra: ";
               
break;
               
case "LASTBUILDDATE":
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Data: ";
               
break;
               
case "LINK":
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Link: ";
               
break;
               
case "DESCRIPTION":
                    echo
"<table width=100%>";
                    echo
"<tr bgcolor=#f7f7f7><td align=left>";
                    echo
"<font face=Arial size=2>Descrição: ";
               
break;
           
}//fim switch
       
}//fim função tags_ini
           
       
//função que traz os dados do xml
       
function dados($parser, $dados) {
            echo $dados
;
       
}

       
//Função que pega tag fechada xml </>
       
function tags_fim($parser, $param) {
            echo
"</font></td></tr></table>";
       
}//fim da funçao tags_fim
               
       
//Abre a o aquivo na url para leitura
       
if (!($ponteiro = fopen($url, "r"))) {
           
die("Não foi possivel abrir o xml");
       
} else {
           
//Loop de leitura do xml
           
while ($dados2 = fread($ponteiro, 4096)) {
                xml_parse
($this->parser, $dados2);
           
}
           
//Limpa o parser da memoria
            xml_parser_free
($this->parser);
       
}//fim if de abertura do xml
   
}//Fim função abre_xml
}//Fim da classe le xml

//abre xml passando seu endereço
$xml_parser
= new le_xml();
$xml_parser
->abre_xml("http://www.maniezo.com.br/site/rss.php");

?>

Comentários:

Mostrando 1 - 10 de 14 comentários
Opa André, eu tô vendo que o artigo é antigo mas se você pudesse me dar uma luz eu ficaria imensamente agradecido, eu preciso(já procurei em todos os lugares) gravar cada link e descrição lidos do xml, você tem alguma idéia de como eu posso fazer isso?

Parabéns pelo conteúdo do artigo e qualquer ajuda vai ser bemvinda, abraços.
21/10/2007 12:12am (~17 anos atrás)

Pessoal...
utilizei esse script e deu o seguinte erro: "O Apache.exe encontrou um problema e precisa ser fechado."
Inicialmente, achei que fosse algo com o script. Mas com todos os outros que eu peguei, que liam XML, acontece a mesma coisa.
Alias, quando lê diretamente o XML, roda beleza. Mas quando eu passo uma URL (no caso do RSS), ai é que da esse erro.
Por favor, alguem ja passou por isso e pode me ajudar:

Agradeço a todos...

Marcos
06/07/2006 1:31pm (~18 anos atrás)

Oi

Estou com um problema... adptei a classe para minha necessidade e preencho um vetor com os dados do xml... esse dados serão inseridos ou atualizados no banco... até ai nenhum problema, meu problema é com as palavras com acento... Ex Florianópolis --> no vetor ou na tela só escreve Florian...
o que eu faço?? alguém pode me ajudar???

esse é o xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
- <rss version="2.0">
- <integracao-fortuna-planilha>
- <sincroniza-funcionarios>
- <funcionario>
<codigo>999</codigo>
<nome>Joao da Silva</nome>
<email>joao@iea.org.br</email>
<cpf>00000000000</cpf>
<endereco>rua x</endereco>
<bairro>centro</bairro>
<municipio>Florianópolis</municipio>
<cep>88113450</cep>
<caixap>1052</caixap>
<fonecom>30258526</fonecom>
<foneres>32465553</foneres>
<fonecel>91052393</fonecel>
</funcionario>
- <funcionario>
<codigo>998</codigo>
<nome>Teste 2</nome>
<email>paula@iea.org.br</email>
<cpf>00000000000</cpf>
<endereco>rua x</endereco>
<bairro>centro</bairro>
<municipio>Florianópolis</municipio>
<cep>88113450</cep>
<caixap>1052</caixap>
<fonecom>30258526</fonecom>
<foneres>32465553</foneres>
<fonecel>91052393</fonecel>
</funcionario>
</sincroniza-funcionarios>
</integracao-fortuna-planilha>
</rss>

já tentei mudar para <?xml version="1.0" encoding="utf-8" ?> mas não adiantou nada.

se alguém puder me ajudar meu email é paula@iea.org.br
03/07/2006 1:53pm (~18 anos atrás)

Na minha página uso um link para me retornar um XML, mas ele vem com muita informação, e só me interessa 3 delas, <COUNTY>, <CITY>, <UF>, como vou fazer para apresentar somente esta em meu site.
15/05/2006 5:56pm (~18 anos atrás)

danilo r lima disse:
ola, gostaria de saber como faço para que leia apenas 3 noticias do xml, nao quero listar todas

t+
30/10/2005 5:30am (~19 anos atrás)

Parabens pelo artigo, mas eu tenho uma nova missão para vcs...

É possível acessar um webservice com o servidor feito em Delphi e o cliente em PHP?

Vou especificar melhor...
Minha empresa tem um servidor feito em em Delphi e nossos sites feitos em ASP acessam facilmente esse webservice com apenas poucas linhas:

Set soapclient = Server.CreateObject("MSSOAP.SoapClient30")

Call soapclient.mssoapinit(Server.MapPath("Nome.wsdl"),"ReservaService","ReservaPort")

Com isso as paginas ASP conseguem utilizar funções que estão nesse servidor.exe (feito em delphi) bastando para isso ter o SOAP tool Kit 3.0, e o servidor.exe instalado na maquina.

Como gosto mais do PHP que do ASP, estou numa luta para tentar demonstrar que é possível fazer a mesma coisa com o PHP, mas esta dificil...

O que eu fiz até agora foi baixar o NuSoap e ja consegui rodar os exemplos que encontrei por aí...
No entanto todos usam servidores e funções feitas no propio PHP.

E se eu quiser usar as funções feitas no Delphi????
Criei uma função Soma que simplesmente soma 2 inteiros para testar o webservice.

Notem que no codigo ASP acima eu consigo passar mais parametros:
ReservaService
ReservaPort


Tentei fazer isto

require_once('nusoap.php');
$wsdl="http://localhost/testes_webservice/Nome.wsdl";
$client=new soapclient($wsdl, 'wsdl');
$param1=array('Valor1'=>20,);
$param2=array('Valor2'=>30);
echo $client->call('Soma', $param1, $param2);


mas não sei onde encaichar os outros dois parametros:
ReservaService e
ReservaPort

para que a comunicação seja feita

Por favor me AJUDEM!
21/02/2005 9:28am (~20 anos atrás)

Ai galera, bazeado nesse artigo eu elaborei uma classe para tratrar noticias Rss!!
Da uma olhada ai:
http://www.phpbrasil.com/scripts/script.php/id/2015
09/02/2005 11:36am (~20 anos atrás)

Robson Mello disse:
Nunca usei php + xml, até que ponto é viável implementar esse estilo de programação?
[]'s
21/01/2005 12:08pm (~20 anos atrás)

Jorge Cardoso disse:
Bem interessante o artigo. Ha algum tempo quero aprender a mexer com isso, mas preciso de informações maiores, pois aidna sou novo no assunto. Mas seu tuto ajudou bastante.
Parabens
12/01/2005 6:45pm (~20 anos atrás)

cara, uma saida legal é usar XSLT...
04/01/2005 9:55am (~20 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)