Ler XML com PHP

  • Autor do post:
  • Categoria do post:PHP DEV

Ler XML com PHP

Veremos como ler um arquivo XML utilizando o método SimpleXML no PHP5, depois que escrevi como criar um arquivo XML com PHP nada mais interessante que saber como ler o arquivo.

Começaremos criando um arquivo XML bem simples, escreva o código abaixo e salve como:

livros.xml

<?xml version=”1.0″ encoding=”iso-8859-1″?>
<livros>
<livro>
<cod>01</cod>
<titulo>PHP para iniciantes</titulo>
<descricao>Desenvolvendo Aplicações web</descricao>
<autor>Manuel da Silva</autor>
<paginas>200</paginas>
<preco>5.00</preco>
</livro>
<livro>
<cod>02</cod>
<titulo>XML</titulo>
<descricao>Usando XML com PHP </descricao>
<autor>José das Couves</autor>
<paginas>100</paginas>
<preco>15.00</preco>
</livro>
</livros> 

Agora que já temos o XML vamos criar o arquivo PHP, salve-o com o nome que quiser.

index.php

<?
#define o encoding do cabeçalho para utf-8
@header(‘Content-Type: text/html; charset=utf-8’);
#carrega o arquivo XML e retornando um Objeto
$xml = simplexml_load_file(“livros.xml”);
# se o xml for um link e nao um arquivo como livros.xml, troque -o pelo link ex.
# $xml = simplexml_load_file(“http://endereco/link/mesmoQueNaoTenhaExtensaoXML/“);

#para cada nó LIVRO  atribui à variavel $livro (obj simplexml)
foreach($xml->livro as $livro)
{
 echo $livro->cod;
#usando o utf8_decode para exibir com acentos
 echo $livro->titulo;
echo $livro->autor;
echo $livro->descricao;
echo $livro->preco;
echo “<br>”;
}
?>

Muito simples! O nome do método não é em vão! 😉

Bem, agora basta você formatar a saida dos dados, utilize tags html formatadas com CSS, um exemplo pode ser como abaixo:

echo “<p><b>Título:</b> ” .$livro->titulo . “</p>”;

Como está no comentário no código, a função simplexml_load_file carrega um arquivo XML retornando seu conteúdo em um Objeto, se quiser ver o detalhes do objeto criado pela função e atribuído à variável $xml, utilize a função do PHP print_r . O resultado será como mostrado abaixo:

O comando print_r($xml) resultará em:

SimpleXMLElement Object
(
    [livro] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [cod] => 01
                    [titulo] => PHP para iniciantes
                    [descricao] => Desenvolvendo Aplicações web
                    [autor] => Manuel da Silva
                    [paginas] => 200
                    [preco] => 5.00
                )

            [1] => SimpleXMLElement Object
                (
                    [cod] => 02
                    [titulo] => XML
                    [descricao] => Usando XML com PHP
                    [autor] => José das Couves
                    [paginas] => 100
                    [preco] => 15.00
                )

            [2] => SimpleXMLElement Object
                (
                    [cod] => 03
                    [titulo] => Javascript
                    [descricao] => O Poder do javascript
                    [autor] => Billy Borny
                    [paginas] => 80
                    [preco] => 9.90
                )

        )

)

Links:

Documentação do SimpleXML:  SimpleXML

Abraços e até o próximo post.  😉

Este post tem 129 comentários

  1. simei

    Valeu a dica e o como fazer um xml… gostei

  2. Alexandro Costa

    Parabéns pelo código rapaz.
    Muito útil para quem está começando.
    Me serviu bem.

  3. Guilherme

    Colega,
    Estou tentando implementar um codigo pra ler as acoes da bovespa, mas o formato gerado pelo webservice deles é diferente.

    Olhe só:
    http://www.bovespa.com.br/Cotacoes2000/formCotacoesMobile.asp?codsocemi=PETR4

    Código gerado

    Ou seja, tem uma chave, e várias informacoes dentro deste…

    Você sabe como fazer a leitura de cada campo de informacao nesse caso ?

    Grato

    1. Rafael Clares

      Olá Guilherme, é preciso ler os atributos do nó!
      Faça o seguinte:

      $xml = simplexml_load_file("linkDaBovestaAqui");
      foreach($xml->PAPEL[0]->attributes() as $a => $b) {
      echo "$a = $b ";
      }

      Espero ter ajudado!

  4. Allan

    Cara,valeu demais,tava procurando por isso !

  5. Andrei

    Olá!
    Muito legal o artigo! Parabéns e obrigado, ajuda muitas pessoas!
    Tenho uma dúvida:

    gostaria de ler os valores Low, High e text.. como procedo neste caso?

    Obrigado!

  6. Andrei

    Ah, nem me liguei nos códigos html e aspas.. aqui vai corrigido, sem os códigos:
    yweather:forecast day=Thu low=17 high=27 text=Mostly Cloudy

    1. Rafael Clares

      Andrei, obrigado pelo comentário.
      Cara, preciso ver o XML inteiro para te ajudar. Mas de toda forma a solução será a mesma que dei 3 comentários acima para o Guilherme.
      Trata-se de ler os atributos de um nó com o método attributes() do simplexml.

      foreach($xml->SuaTagNo[0]->attributes() as $a => $b) {
      echo “$a = $b “;
      }
      Sem o XML inteiro não rola, se quiser me envie o link do XML ou o arquivo ([email protected]).

      flw

  7. Andrei

    Olá!
    Inicialmente, obrigado pela resposta e a ajuda!
    O xml (rss) que quero utilizar é este:
    http://weather.yahooapis.com/forecastrss?p=BRXX1781&u=c

    achei outras formas de extrair os dados que quero, mas nao buscando especificamente o nó do xml, só usando a função preg_match() mesmo.

    Se puder ajudar, excelente, mas nem se estresse muito também.
    obrigado!

  8. luiz tarabal

    Very nice!!!

    simple_xml always!

    thanks

  9. klonder

    Excelente explicação! Será muito útil pra mim!

    Muito obrigado!

  10. Eduardo Faria

    Vlw pakas! ajudou bastante! era o que eu estava precisando. =D

  11. Fernando

    Parabéns… excelente artigo!!

    .

  12. Eric Malzone

    Excelente artigo, vou montar uma estrutura em um site de forma que crie um arquivo XML e depois somente faça a leitura do mesmo para evitar acessos ao banco que torna o site muito demorado as vezes…obrigado!

  13. Alcir

    Massa… paragens pelo blog…

  14. Felipe Marciano

    Nossa, mandou muito bem na explicação! Clara e sucinta, a melhor que eu já vi! Parabéns e sucesso!
    Abraço.

  15. Mario

    Eu não entendo a utilização do utf8_decode().

    O manual do PHP diz:

    This function decodes data, assumed to be UTF-8 encoded, to ISO-8859-1.

    Se a codificação do arquivo .xml é iso-8859-1, os dados carregados não deveriam vir com esse mesmo padrão?

    []’s
    Mario

  16. thiago corradi

    Olá Rafael j usei uma galeria sua que funcionou 100% ja ate te amdnei o link para ver…

    Agora estou com um problema aqui não mexo muito em programação e tenho q publicar uns arquivos em xml na web são relatorios como que faço tenho que parser todo o codigo java? ou exite algum frameworks que vc indica o xml na pasta tal e ele imprimir na tela o relatório?

    caso nao consiga fazer vc conraria quanto pra fazer um arquivo desse

    1. Rafael Clares

      Olá Thiago, poxa cara precisa passar mais detalhes sobre o programa.
      Passa aí seu msn.
      abraços

  17. Augusto

    Ai fica mais mole que sopa de minhoca ! ! !
    Obrigado ai Rafael!!!!

  18. Raphael

    Muito útil, valeu irmão.

  19. Geovani

    vlw irmao, tava precisando hehehe

  20. Thiago

    Show de Bola!!! Ta tirando a galera do sufoco!

  21. Carlos

    Olá, Rafael!

    Estou com um sério problema… O método retorna o seguinte erro no Browser:

    ———————————————————————————————————
    A PHP Error was encountered

    Severity: Warning

    Message: SimpleXMLElement::__construct() [simplexmlelement.–construct]: Entity: line 1: parser error : Start tag expected, ‘<' not found

    Filename: controllers/site.php

    Line Number: 39

    A PHP Error was encountered

    Severity: Warning

    Message: SimpleXMLElement::__construct() [simplexmlelement.–construct]: arquivo.xml

    Filename: controllers/site.php

    Line Number: 39

    A PHP Error was encountered

    Severity: Warning

    Message: SimpleXMLElement::__construct() [simplexmlelement.–construct]: ^

    Filename: controllers/site.php

    Line Number: 39

    String could not be parsed as XML
    ———————————————————————————————————–

    Já tentei de tudo!!!!! Sabe o q pode estar acontecendo??!!

    Muito obrigado!!!!

    Abraços,
    Carlos.

    1. Rafael Clares

      Carlos, seu XML é invalido, dê uma olhada se não tem caracter não permitido no XML como quebra de linhas ou algo do tipo, qualquer coisa posta o XML.

  22. Carlos

    Obrigado, Rafael! Realmente havia um problema no xml.

    Tenho uma outra dúvida… Essa p/ salvar minha vida! rs.

    Tenho o seguinte xml válido:

    ———————————————————————————–

    54.00
    arquivo1.xls
    Conta de Telefonia

    132.40
    arquivo2.xls
    Conta de Telefonia

    98.05
    arquivo3.xls
    Conta de Telefonia

    ——————————————————————————————

    Como eu faço para q, ao ler esse arquivo com a função $xml = simplexml_load_file(“info.xml”), monte um loop que leia os atributos do xml e me retorne os nós de “valor”, “link” e “descrição” para o atributo numero igual à “2492133887”?

    Procurei na web mas não consigo solucionar essa questão! Poderia me ajudar??

    Grande abraço e agradeço desde já!

    Carlos.

    1. Rafael Clares

      Carlos, sinto prazer em ajudar, mas cara… não adianta postar 100 comentários um atrás do outro que não vai contribuir para que eu lhe ajude mais rapidamente… Antes de postar a dúvida dê uma olhada ou faça uma busca no blog para ver se já não existe a solução, geralmente quando já tem no blog eu nem respondo.
      Quanto à busca dentro do XML: http://clares.wordpress.com/2008/12/04/busca-em-xml-com-php/
      Quanto aos atributos: http://br3.php.net/manual/en/book.xmlwriter.php
      abraços

      1. Carlos

        Olá, Rafael.

        Acho q fui mal interpretado… Os comentários que postei em sequência se deu ao fato d q o xml q eu estava colando no corpo da mensagem não estava sendo reconhecido pelo seu blog como um string… Então tive que substituir os nós pelo caracter “[ ]”. Como pode ver no último post, até pedi desculpas por isso.

        Obrigado pelos links e parabéns pelo trabalho. Desculpe se lhe trouxe algum transtorno.

        1. Rafael Clares

          Tá firmeza man. Fique à vontade, se eu puder ajudar então beleza.
          Desculpe ae tbm ok 🙁
          abraços

  23. Carlos

    [contas]
    [linha numero=”2182965991″]
    [valor]54.00[/valor]
    [link]arquivo1.xls[/link]
    [descricao]Conta de Telefonia[/descricao]
    [/linha]
    [linha numero=”2492133887″]
    [valor]132.40[/valor]
    [link]arquivo2.xls[/link]
    [descricao]Conta de Telefonia[/descricao]
    [/linha]
    [linha numero=”2194107000″]
    [valor]98.05[/valor]
    [link]arquivo3.xls[/link]
    [descricao]Conta de Telefonia[/descricao]
    [/linha]
    [/contas]

  24. Carlos

    Agora foi! substituí o “” por “[]”. 🙂

    Pode apagar os outros. Foi mal! 🙁

  25. victor matuk

    show. melhor dica q achei =)

  26. Bruno Costa

    Só tem uma coisa errada nesse código…. você não pode utilizar o shortcode para abrir o php, ou seja, ao inves de usar <? use <?php

    Mas o código é simples e util

    1. Rafael Clares

      Bruno, se não pudesse utilizar, ele não estaria disponível no PHP e o código não funcionaria.
      Ah, acho que você quis dizer “short tag”.
      Obrigado pelo comentário.

  27. Vasco

    Gostava de saber qual o código PHP para, através de um parâmetro de pesquisa num formulário, obter apenas o registo(s) correspondente(s) do ficheiro XML.
    Agradeço.

      1. Vasco

        Olá Rafael,
        Se puder dar-me uma ajuda na construção do form, agradeço.
        A minha dificuldade está nas propriedades do formulário de pesquisa e o respectivo código para retornar o registo específico do ficheiro XML.
        Mais uma vez obrigado.

        1. Rafael Clares

          Vasco, me envia o seu formulário atual por email para eu ver. (rafadinix@gmail) Ah, não mande dúvidas por email, apenas o arquivo, as dúvidas continue postando no blog, não respondo email com assuntos do blog.

    1. Daniel

      Olá. Em primeiro lugar quero parabenizar o Rafael por este blog que tem ajudado muitos iniciantes em PHP, simplesmente uma “mão na roda”.
      Bom, estou com problema para ler um XML através do PHP pois meu sistema faz uma comparaçõ com o que está dentro da tag e se for igual com a informação vinda do banco de dados ele captura os dados e grava no bd. Ocorre que na tag tem um espaço em branco antes do nome da cidade e meu sistema entende como um caracter a mais. Exemplo: São Paulo então se no banco de dados está São Paulo sem o espaço em branco antes e desonsidera a informação e não captura os dados daquele XML. Já tentei trim, rtrim e ltrim e não consegui. Se puderem me ajudar aghradeço de coração. Obrigado, Daniel.

      1. Rafael Clares

        Daniel, ao invés trim ou rtrim crie essa function abaixo e a utilize:

        function fulltrim($str)
        {
        return preg_replace(‘/s+/’,”,$str)
        }

        Abs

  28. Saulo

    Pessoal, preciso de um código que leia vários arquivos xml, tipo: arquivo1.xml, arquivo2.xm… arquivo 100.xml.
    Depois de ler inserir no banco de dados SQL Server.
    Desde já agradeço demais a atenção de vocês.

    Grato,

    Saulo.

    1. Rafael Clares

      E ae Saulo, beleza?
      cara, é um código não muito simples… você já tem algo aí, um começo?
      até logo,
      abs

    1. Rafael Clares

      Oie Gisele, mandei no seu email.
      até logo,

      Outros interessados no script: download

      1. AndreLC

        Oie Rafael,

        Aproveitando o script que mandou para a Gisele, como fazer aí para que, por exemplo, se não houvesse a tag cod mas se fosse atributo do titulo, como fazer para extrair o atributo neste exemplo de banco de dados?

        Obrigado.

        vlw

  29. AndreLC

    Oie,

    Outra dúvida minha… Se o livro estiver em várias categorias e eu quiser colocar ele em mais que uma categoria possuindo cod iguais, como fazer aí brother?

    É que pelo que teste ele se tiver 2 cod iguais, substitui e eu não queria não.

    Obrigado.

    Abraço aí

    1. Rafael Clares

      Poxa André, 2 códigos iguais não rola mesmo, uma vez que este seria a chave primária e deve ser único.
      Neste caso o que você pode fazer é listar por categorias, assim o item que existe em mais de uma categoria seria listado também.
      Mesmo assim, o ideal é criar a estrtura do xml com nós cara categoria, ex:
      categoria
      cod_categoria
      livro
      cod_livro
      livro
      categoria

  30. Carlos Cesar Nardo Junior

    Salve parcerinho Rafael, blz?

    então, eu to fazendo um sistema em flash + XML de notícias. até aí tudo bem, se não fosse pelo fato que o flash, por medidas de segurança, não lê arquivos XML hospedados em outro servidor.

    a saida que eu encontrei é pegar os nós do xml e armazenar em variaveis no php, depois eu pegar essas variaveis e exibir no flash.

    eu pegar as variaveis do php e exibir no flash é tranquilo, o meu problema ta sendo transformar os nós do xml em variaveis do php

    tem uma luz pra me ajudar man?

    abraços!

  31. Felipe

    fala Rafael. muito bom esse tutorial. sempre acompanho os artigos. sempre muito boms.
    gostaria de saber o seguinte. e se no xml tiver traço. por exemplo o nome do nó do meu XML eh e la nas variaveis eu coloco foreach($xml->livro-semcapa as $livro-semcapa)

    nao funciona pra min dessa maneira. acho que eh por causa do traço. oque fazer neste caso?

    1. Rafael Clares

      rsrs rs rapaz você está subtraindo as vars, é o mesmo que fazer 5-4 … utilize vars com underline se precisar.
      abs

      1. Felipe

        usei assim e funcionou. foreach($xml->{‘livro-semcapa’} as ${‘livro-semcapa’})

        fcia a dica pra galera.

  32. rosa

    to com um problema q pra vcs pode parecer mto simples, mas pra mim ta sendo algo mto complexo tipo to fazendo um trabalho com XML qro salvar o conteudo das tags em um arquivo html eu fiz da seguinte maneira :

    <?php
    $xml = simplexml_load_file("31110907783016000167550020000218941002243019-nfe.xml");
    echo <<<EOD

    NFe

    EOD;

    $natOP = $xml->ide->natOp;
    $xNome = $xml->ide->xNome;

    echo $natOP;
    echo $xNome;

    Mas ñ funcionou axo q o problema esta no local onde ta armazenado o XML ñ tenho um servidor e esses arquivos são de NFe salvei na pasta www e ñ deu certo onde posso salvar?coloquei o caminho relativo pq o codigo e o xml estão na mesma pasta(www) o q posso fazer?

    1. Rafael Clares

      Remova o echo <<<EOD e utilize echo "NFe"; apenas.

  33. rosa

    gente alguém pode me responder o pq q meu codigo ñ esta funcionando?<?php
    $xml = simplexml_load_file("notafiscal.xml");
    echo <<<EOD

    NFe

    EOD;

    $IE = $xml->emit->IE;
    $xNome = $xml->emit->xNome;
    $CNPJ1 = $xml->emit->CNPJ;

    $natOP = $xml->ide->natOp;
    $xFant= $xml->ide->xFant;
    $dEmi = $xml->ide->dEmi;

    $nProt = $xml->infProt->nProt;

    $xNome = $xml->dest->xNome;
    $CNPJ = $xml->dest->CNPJ;
    $xLgr= $xml->dest->xLgr;
    $xBairro = $xml->dest->xBairro;
    $CEP = $xml->dest->CEP;
    $xMun = $xml->dest->xMun;
    $fone = $xml->dest->fone;
    $UF = $xml->dest->UF;
    $IE2 = $xml->dest->IE;

    $xNometrans =$xml->transporta;
    $CNPJtrans =$xml->transporta;

    echo $natOP;
    echo “nome é:$xNome”;
    echo “”;

    ?>

    1. Rafael Clares

      O ideal é postar também a mensagem de erro. mas de qualquer forma eu arrisco que é devido ao echo <<<EOD , acho que não há necessidade de utilizad <<< para printar uma única palavra, no geral, utiliza-se para string longa.

      1. Rosa

        aconteceu isso pq qndo mandei ñ foi mostrado o codigo html q tava dentro do EOD, esses dias pesquisando e fazendo testes conclui q o erro tá no xml, pq fiz um xml e usei o mesmo codigo e funcionou…quando no xml aparece assim:(na verdade tirei os < pq se colocar ñ vai aparecer na tela, mas no codigo ta normal!)
        nfeProc xmlns="http://www.portalfiscal.inf.br/nfe&quot; versao="2.00"
        – NFe xmlns="http://www.portalfiscal.inf.br/nfe&quot;
        – infNFe Id="NFe31110907783016000167550020000217651005934252" versao="2.00"
        axo q essas informações ñ conseguem ser lidas pq estas estao sendo mandadas p/ um outro lugar, percebi q assim q tirei isso e reorganizei o codigo funcionou logo esse deve ser meu foco esse erro pq ñ posso ficar configurando assim q o xml ate pq qro q tudo isso seja de forma automatica, ñ posso ficar configurando cada vez q xegar um novo xml, e agora o q fazer?alguem pode me ajudar?Brigada.

        1. Rafael Clares

          Disponibilize o código para download e me avise. até mais

  34. rosa

    considere o codigo assim:
    emit->IE ;
    $xNome = $xml->emit->xNome;
    $CNPJ1 = $xml->emit->CNPJ;
    $natOP = $xml->ide->natOp;
    $xFant= $xml->ide->xFant;
    $dEmi = $xml->ide->dEmi;

    $nProt = $xml->infProt->nProt;

    $xNome = $xml->dest->xNome;
    $CNPJ = $xml->dest->CNPJ;
    $xLgr= $xml->dest->xLgr;
    $xBairro = $xml->dest->xBairro;
    $CEP = $xml->dest->CEP;
    $xMun = $xml->dest->xMun;
    $fone = $xml->dest->fone;
    $UF = $xml->dest->UF;
    $IE2 = $xml->dest->IE;

    $xNometrans =$xml->transporta;
    $CNPJtrans =$xml->transporta;
    echo $IE;
    echo $xNome ;
    echo $CNPJ1 ;

    echo $natOP;
    echo $xFant;
    echo $dEmi ;

    echo $nProt;

    echo $xNome;
    echo $CNPJ;
    echo $xLgr;
    echo $xBairro;
    echo $CEP;
    echo $xMun;
    echo $fone;
    echo $UF;
    echo $IE2;

    echo $xNometrans;
    echo $CNPJtrans ;

    ?>

    1. Rafael Clares

      Rosa, está muito difícil de entender o código. Tente copiar e colar em um arquivo com extensão txt e hospedar em algum lugar, feito isso me passe o link, ou até mesmo link para download. Até logo,

      1. Rosa

        ah akela parte ja deu certo brigada pela ajuda, só q agora tenho uma duvida é possivel atraves do php contar a quantidade de tags xml por exemplo tenho assim
        (pessoa) Rosa(/pessoa)
        (pessoa)Rafael(/pessoa)
        há alguma forma de contar qntas tags tenho com mesmo nome?

  35. Daniel Lemes

    Esse artigo salvou muito do meu tempo, muito obrigado!
    Você devia abrir um pool de doações no blog, certamente algumas pessoas gostariam de retribuir o excelente serviço prestado de graça.

    1. Rafael Clares

      hehehehehe orra Daniel, a idéia não é ruim não viu rs rs você insentivar aí a galera fazendo a primeira doação hehehe
      forte abraço, valeu!

  36. Daniel Lemes

    E só fiquei com uma pequena (não sei se é tão pequena) dúvida: digamos que esse mesmo xml tem 5000 registros de livros. Tem como exibir apenas os cinco primeiros resultados, por exemplo?

    1. Rafael Clares

      Daniel, os dados retornam em um objeto mas você pode passar para um array se preferir, nos 2 casos você pode utilizar contadores.
      Na sua pergunta em si, você pode exibir apenas os 5 primeiros fazendo assim:
      $count = 0;
      foreach($xml->livro as $livro)
      {
      if($count cod;
      #usando o utf8_decode para exibir com acentos
      echo utf8_decode($livro->titulo);
      echo utf8_decode($livro->autor);
      echo utf8_decode($livro->descricao);
      echo $livro->preco;
      echo “
      ”;
      }
      $count++;
      }

      abs

  37. Rosa

    ah muito obrigada!valeu mesmo oh lol consegui contar a quantidade de tags, porém, ainda tenho uma duvida(desculpa é pq tô começando agora a programar, esse é meu primeiro projeto ai ñ sei mto) é pq preciso ler uma tag com um atributo especifico ex: (produto nItem=”1″)(/produto)…(produto nItem=”3″)(/produto) há alguma forma de pegar só a tag com o atributo nItem=”3″?

    1. Rafael Clares

      Rosa, não tenho como desenvolver toda a aplicação, talvez seja interessante você ler um pouco a referência deixada ao fim do post!

  38. marcelocrico

    Olá amigo, parabens pelo Blog.

    Estou com uma duvida…

    Copiei o código xml proposto e salvei com livros.xml

    01
    PHP para iniciantes
    Desenvolvendo Aplicações web
    Manuel da Silva
    200
    5.00

    02
    XML
    Usando XML com PHP
    José das Couves
    100
    15.00

    Entao criei o php as.php

    Untitled Document

    livro as $livro)
    {
    echo $livro->cod;
    #usando o utf8_decode para exibir com acentos
    echo utf8_decode($livro->titulo);
    echo utf8_decode($livro->autor);
    echo utf8_decode($livro->descricao);
    echo $livro->preco;
    echo “”;
    }

    print_r($xml);
    ?>

    Quando acesso o arquivo as.php a página vem em branco, poderia me ajudar?

    1. Rafael Clares

      MArcelo, verifique se ao copiar as aspas não foram trocadas por apóstrofos, geralmente isso ocorre ao copiar o código e gera erro!

  39. Flavio

    Mto bom isso!

    Mas uma dúvida, pq vc usou o utf8_decode? Nao é só setar o xml como UTF-8?

    Abraços

    1. Rafael Clares

      Flávio, você não é o primeiro que faz essa pergunta e também não foi o primeiro a testar o que se propoem.
      Veja, para que o XML esteja com encoding UTF-8 eu teria que escreve seu conteúdo em UTF-8 e eu não consigo fazer isso.
      Neste exemplo temos:
      José das Couves
      Isso não é UTF-8, é iso-8859-1 !

      UTF-8 seria assim:
      José das Couves

      Eu não consigo escrever em UTF-8 rs rs rs
      Se eu alterar o encoding do XML para UTF-8 e escrever algo do tipo “José” haverá um erro na devido a letra “é” já que esta não é utf-8.

      O que eu poderia fazer para evitar o uso do utf8_decode() seria definir o header do PHP como abaixo:
      @header(‘Content-Type: text/html; charset=utf-8’);

      Tanto é que irei alterar o post, de toda forma, acho muito bacana que pessoas e outros que fizeram a pergunta tenham interagido uma vez que sou apenas um iniciante e isso me faz repensar os métodos em que as coisas foram feitas.
      Fico muito agradecido pelo seu comentário e claro, gostaria que você testasse essa questão que levantou,
      1º – retirar o utf8_decode e testar
      2º – alterar o encoding do XML para UTF-8 e testar (neste verá que ocorerrá um erro ao tentar ler os acentos)

      Forte abraço,

  40. Rodolfo

    Muito obrigado irmao, me ajudou MUITOOO!!!!

    bom demais!

  41. Gustavo Voll

    Fala Rafael, blz?

    Gostei muito das dicas que vc dá, e sobre o proprio post. Estou precisando popular um combobox de um form com dados de um XML mais simples que esse aí que vc usa no exemplo. A minha dúvida é se esse seu código funciona para o WordPress. Não estou achando em lugar nenhum nada falando sobre isso para WordPress.

    //Abs

    1. Rafael Clares

      Gustavo, funciona sim, o wordpress é feito em PHP, logo, qualquer código em PHP funcionará no wordpress desde que você saiba onde inserir o código! Abs

      1. Gustavo Voll

        Rafael, criei um template (teste.php), copia do page.php só que com esse código. Achei que deveria funcionar também, mas não retorna nada. :/

        1. Rafael Clares

          Gustavo, coloque a linha abaixo no início do script para tentar exibir alguma mensagem de erro.
          error_reporting( E_ALL );

          Obs: desculpe a demora em responder, estive de mudança e fiquei sem net.

  42. ygor

    como eu faço para ler esse xml agredeço des de ja

    ?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

    001
    Super Comprável em: Caprichado sanduíche “Super Beirute” para até 3 pessoas + Coca-cola de 2L. No Nilo Esfihas com 59% OFF, de R$ 27,00 por apenas R$ 10,90. Delícia no sabor e no preço!
    http://www.realdescontos.com.br/img_ofertas/e830c8c9f5764abc77f02ee5dbd12d8590bf164e.jpg.pagespeed.ce.369YhRIh9r.jpg
    27,00
    10,90
    59
    2011-12-02 20:25:00
    ofertas
    Compravel

    Rua Pereira Filgueiras, 1931 loja K – Aldeota. Fortaleza, CE
    http://www.compravel.com.br/#!/oferta/id/50
    fortaleza

    1. Rafael Clares

      Poxa Igor, é conforme está no post mesmo, acontece que você precisa me dizer qual sua dificuldade. Me desculpe a demora em responder, estive de mudança e fiquei sem internet. abs

  43. Marcos Martins

    Olá Rafael,

    Amigo, estou tentando usar um código PHP para ler esse arquivo XML dos produtos do CorpoPerfeito =>> Exemplo:
    http://www.parceriaperfeita.com.br/vitrine.xml?anunciante=1&Quantidade=10

    Estou tentando aplicar o mesmo método, mas como existem muitos registros de campos, estou meio perdido por onde começar. Pode me dar um exemplo?

    Fiz esse exemplo simples: Mas ele não consegue ler, acredito que os campos não estão corretos.

    SubProduto as $SubProduto)
    {
    echo $SubProduto->Id;
    #usando o utf8_decode para exibir com acentos
    echo “Nome Produto: ” .$SubProduto->Nome. “”;
    echo “Valor: ” .$SubProduto->PrecoPor. “”;
    echo “”;
    }
    ?>

    —–
    Preciso de ajuda, obrigado!

    1. Rafael Clares

      Olá Marcos, o ideal é você informar a mensagem de erro que ocorre, assim fica mais fácil te ajudar!
      Post o erro para eu ver o que há errado!
      Abs

  44. Ricardo

    #inicio#
    #GET nItem=”1″#
    #posicao#
    #nome#alcantara#/nome#
    #coluna#100#/coluna#
    #inha#200#/linha#
    #/posicao#
    #/GET#
    #GET nItem=”2″#
    #posicao#
    #nome#willian#/nome#
    #coluna#300#/coluna#
    #linha#400#/linha#
    #/posicao#
    #/GET#
    #/inicio#’

    substitui as por # pois seu blog bloqueia… =]

    Opa rafael tudo bem? estou com dificuldades para criar um array deste xml…

    eu gostaria de criar um array da seguinte forma..

    array[‘GET’][‘1’][‘posicao’][‘nome’] = alcantara

    obs:onde ‘[‘1′]’ é o valor do attributo ‘nItem’

    array[‘GET’][‘2’][‘posicao’][‘nome’] = willian

    obs:onde ‘[‘2′]’ é o valor do attributo ‘nItem’

    estou tentando dessa forma.. mas sem sucesso…

    foreach ($myxml as $tag)
    {
    $eRet[$tag->getName()][$myxml->GET->attributes()] = $tag;

    }

    pode dar uma ajuda ai? obrigado!!!

    1. Rafael Clares

      Rapaz, segue o código:

      $xml = simplexml_load_file(“test.xml”);
      $json = json_encode($xml);
      $array = json_decode($json,TRUE);
      print_r($array);

      Boa sorte!

      1. Ricardo

        Opa, tudo bem? Obrigado pela resposta…

        mas o retorno dessa a função é o mesmo que o da função acima….

        foreach ($myxml as $tag)
        {
        $eRet[$tag->getName()] = $tag;

        }

        return(print_r($eRet));

  45. Anderson

    não consegui fazer funcionar…

    1. Rafael Clares

      Anderson, ficou muito genérico isso rs rs
      Quer tentar dizer se deu alguma mensagem de erro, se apareceu algo na tela, se alterou algo, etc… ?
      No aguardo,

  46. patrick

    Rafael para ler arquivos soap asmx(webservice) como do exemplo
    “http://wsi1.unitfour.com.br/intouchws.asmx?op=LocalizaPessoas”
    que procedimento devo fazer.

    1. Rafael Clares

      Patrick, esse tipo de XML é gerado para descrever um serviço de webservice, a ideia é chamar um dos serviços descritos e não ler o XML, mesmo porque a grosso modo,
      é um XML para cada serviço nesse exemplo que você mandou e não dá para simplesmente ler e obter algum resultado. Você precisa chamar o serviço, procure no google por “NuSoap PHP”;
      Abraços e desculpe a demora em responder, eu passei batido da sua pergunta e não vi…

  47. fabio

    Obrigado, foi muito util

  48. Eduardo

    Olá rafael, gostaria que você ou alguém do blog me auxiliasse na medida do possível, estou começando a mexer com webservice e não estou conseguindo gerar uma resposta de xml válida. O Server é de um cliente, preciso apenas arrumar um jeito de ler as informações…

    http://opmanager.fabricadesoftware.net.br/WebService/opManager.asmx?wsdl

    alguém pode me ajudar com isso ?

  49. Gilbert Eterovisk

    Cara ….muito bom… Ajudou demais! Obrigado!

  50. Fernando Melo

    Olá tem como fazer o download do arquivo xml ao invés dele ser exibido(compilado) no navegador?

    1. Rafael Clares

      Fernando, dá sim, mas dê uma procurada no blog pelos demais artigos sobre XML que você irá encontrar uma opção legal!
      Abs

  51. Victor Dias

    Olá..

    Estou com dificuldade pois nao entendo do assunto e é a primeira vez que tenho de fazer isto.. tenho um ficheiro XML e preciso mostrar o conteudo no site.. como fazer ??.. me puderem ajudar…. o XML tem este conteudo..

    R… B…
    geral@…….com
    http://…….com
    public_html/namemusica//current_animator.png

    Obrigado

    1. Rafael Clares

      Victor, cara o comentário ficou meio bagunçado, tenta enviar novamente ok;

    1. Rafael Clares

      Que mensagem aparece ao executar o script ?

      1. Marcio Matielo

        Não aparece nenhuma mensagem de erro, a página aparece em branco, ou então os echos que eu forço para debug fora do loop que busca as informações do XML.

        1. Rafael Clares

          Marcio, precisaria ver o código para entender o que ocorre de errado!

    1. Rafael Clares

      Fala Adriano, segue:

      @header(“Content-Type: text/html; charset=utf-8”);
      $xml = simplexml_load_file(“http://cep.republicavirtual.com.br/web_cep.php?cep=91010000&formato=xml”);
      echo “$xml->uf – $xml->cidade – $xml->bairro – $xml->logradouro”;

      1. Adriano

        Obrigado… valeu.

  52. Marcelo

    Rafael, havia uma pergunta aqui sobre o xml do parceria perfeita: “Http://beta.parceriaperfeita.com.br/vitrine.xml?anunciante=1&ordenacao=menorpreco&quantidade=10&direcaoordenacao=asc&palavraschave=camisa”, mas não consegui acompanhar o desenrolar da pergunta. Tem como vc dar uma ajuda? Não sou programador, mas queria colocar a vitrine xml no meu site. Obrigado.

    1. Rafael Clares

      Marcelo, não consegui ver seu link, daí ficou ruim de ajudar… parece não existir;

  53. Felipe

    no comentário acima não foi a XML.. tentarei retratar de uma forma aceitável ao fórum…
    nfeProc xmlns=”http://www.portalfiscal.inf.br/nfe” versao=”2.00″
    NFe xmlns=”http://www.portalfiscal.inf.br/nfe”
    infNFe Id=”NFe123″ versao=”2.00″
    ide
    Preciso capturar o que está aqui…
    /ide
    /infNFE
    /NFE

    Grato,

    1. Rafael Clares

      Felipe, posta lá no pastebin.com o seu código e me passa o link aqui. Abs

  54. EnigmA

    Gostei bastante! Valeu

  55. Anderson Weschnhoski

    Fala Rafael!

    Me diz uma coisa. Estou tentando ler alguns nós de um feed, porém, alguns deles tem “:” no nome do nó. Por exemplo:

    Como o SimpleXML gera isso?

  56. icenysp

    Cara, como faço pra ler o XML de forma invertida? Tentei usar o “array_reverse” em tudo o que é lugar no fonte de exemplo que você postou e não consegui. Em alguns não retornava resultado, em outros não lia invertido. Agradeço se puder ajudar.

    1. Rafael Clares

      Desculpe a demora em responder, estive ausente por algum tempo. Eu não entendi bem o que deseja fazer, talvez seja legal colocar o código no pastebin para eu tentar entender o que deseja;

      1. icenysp

        Quero fazer a leitura do XML em ordem decrescente, do último item para o primeiro mas não consigo, mesmo usando “array_reverse”, que foi a explicação mais comum que encontrei na internet. Se puder ajudar, agradeço. E obrigado por responder.

        1. Rafael Clares

          Coloca seu código lá no pastebin para eu ver como está!

  57. Adriano

    Olá boa noite, como poderia acontecer, estou usando ler o xml em php vindo de uma API de Streaming onde mostra o nº de ouvintes , nome da música etc…
    Usei o script em um site e funciona perfeitamente , usei o mesmo script em outro site e não faz a leitura, e ambos os sites estão no mesmo servidor com as mesmas configurações então o que poderia ser ? Já conferi e está correto mas não faz a leitura.

    1. Rafael Clares

      Adriano, confira se há algum php.ini em um dos sites e certifique-se de ter habilitado no php.ini o fopen_url.

      1. Adriano

        Realmente Rafael , obrigado era isso mesmo e eu não percebi. rsrs obrigado valew!

  58. Noel Santos

    Olá!

    Parabéns pelo blog!

    Sou um noob em PHP ainda, mas eu queria só corrigir um detalhe:

    Onde diz:
    “#carrega o arquivo XML e retornando um Array
    $xml = simplexml_load_file(“livros.xml”);”

    Na verdade, a função retorna um OBJETO e não um ARRAY.
    Estou certo?

    Abraço!

    1. Rafael Clares

      É sim, Noel, está errado o comentário do código. Obrigado
      Quando escrevi isso, em 2012, eu era tão noob quanto você, na verdade era mais, já que você prestou atenção nisso e eu não.
      Abs

  59. Jonas Felipe

    By Jonas Felipe

    Como faço para o SimpleXML ler meu arquivo, achar a palavra que quero e contar quantas vezes ela aparece no arquivo??

  60. rodrigo

    boa tarde, se o xml estiver com caractere especial, teria como reverter em php?

Os comentários estão encerrados.