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 (~16 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 (~18 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 (~19 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 (~19 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 (~19 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 (~19 anos atrás)

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

Novo Comentário:

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