Gerar XML com PHP

Publicado: fevereiro 10, 2008 em PHP, XML
Tags:,

Gerando XML com PHP5  

Vamos ver como gerar  um arquivo XML simples usando PHP5 e API DOM, se você não possui o PHP5 baixe o EasyPHP. 

  


<?
#versao do encoding xml
$dom = new DOMDocument("1.0", "ISO-8859-1");

#retirar os espacos em branco
$dom->preserveWhiteSpace = false;

#gerar o codigo
$dom->formatOutput = true;

#criando o nó principal (root)
$root = $dom->createElement("agenda");

#nó filho (contato)
$contato = $dom->createElement("contato");

#setanto nomes e atributos dos elementos xml (nós)
$nome = $dom->createElement("nome", "Rafael Clares");
$telefone = $dom->createElement("telefone", "(11) 5500-0055");
$endereco = $dom->createElement("endereco", "Av. longa n 1");

#adiciona os nós (informacaoes do contato) em contato
$contato->appendChild($nome);
$contato->appendChild($telefone);
$contato->appendChild($endereco);

#adiciona o nó contato em (root) agenda
$root->appendChild($contato);
$dom->appendChild($root);

# Para salvar o arquivo, descomente a linha
//$dom->save("contatos.xml");

#cabeçalho da página
header("Content-Type: text/xml");
# imprime o xml na tela
print $dom->saveXML();
?>

 

  

Neste exemplo utilizamos dados pré-definidos, mas poderiamos ter utilizado o resultado de uma consulta SQL. 

Exemplo funcionando Exemplo XML 

Agora, o resultado é excelente, porém, repetir esses comandos acima para cada contato é bem desgastante, vejamos uma função para automatizar a criação dos contatos. 

<?php
function addContato($document, $nome, $fone, $end)
{
 #criar contato
 $contato = $document->createElement("contato");
 
 #criar nó nome
 $nomeElm = $document->createElement("nome", $nome);
 
 #fone
 $foneElm = $document->createElement("telefone", $fone);
 
 #endereco
 $endElm = $document->createElement("endereco", $end);
 
 $contato->appendChild($nomeElm);
 $contato->appendChild($foneElm);
 $contato->appendChild($endElm);
 return $contato;
}

$dom = new DOMDocument("1.0", "ISO-8859-1");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

$root = $dom->createElement("agenda");

#utilizando a funcao para criar contatos
$Tiao = addContato($dom, "Tiao J.", "5555-4444", "R. Jaú, 3");
$Joao = addContato($dom, "Joao S.", "4444-5555", "R. Itú, 4");

#adicionando no root
$root->appendChild($Tiao);
$root->appendChild($Joao);
$dom->appendChild($root);

#salvando o arquivo
$dom->save("agenda.xml");

#mostrar dados na tela
header("Content-Type: text/xml");
print $dom->saveXML();

?>

A função acima produz o mesmo resultado que o primeiro exemplo, porém de uma forma mais simples na hora de criar os contatos, sendo assim para utilizar em seus estudos aconselho utilizar a função do segundo exemplo. 

Exemplo funcionando Exemplo XML utilizando a função 

Leia o outro post sobre gerar XML com PHP em :
http://clares.wordpress.com/2009/09/29/gerar-xml-com-php5-e-xmlwriter/

Este outro post é ainda mais simples de entender. 

Até a próxima, 

Rafael Clares

Comentários
  1. Michel disse:

    Cara, como seria para LER um arquivo XML ?

  2. Laerti Borba disse:

    Cara, muito bom este seu exemplo, me ajudou muito, pois tinha uma prova onde deveria criar um formulario em PHP e ele submeter os dados para um arquivo XML, e foi com esta sua dica que me salvou. Valeu.
    Laerti

  3. Ivaldo Trentin disse:

    Kra, muito lega a maneira que usou para explicar a maioria dos lugares usa a criação de arquivos xml da mesma maneira que criamos os txt, somente concatenando string… dessa maneira fica muito mais simples e claro o codigo.

  4. Glauber disse:

    Show de bola!!
    Parabéns!!

  5. Gabriel Lau disse:

    Rafael, tem como tu dar um exemplo de como seria usando um banco de dados???
    Tipo: Sempre que eu inserir um registro novo no banco, ele pega os dados que já tem lah, e atualiza essa lista no xml…

    Está show de bola essa sua solução para gerar XML… já está no meu BLOG.. ;)

    • Rafael Clares disse:

      Gabriel, beleza ai…então tá!
      Cara, para fazer com BD basta você trocar as linhas onde os dados são inseridos manualmente, mas isso é bem óbvil, ok, vamos lá…
      coloque as linhas abaixo dentro do seu laço que está retornando os dados do BD, agora se você quer aprender à utilizar um BD é outra coisa… infelizmente não é o propósito do Post.
      Supondo que você utiliza Postgre e ja chamou a conexao com o banco:
      //conexao ok
      $strQuery = “select * from clientes”;
      $query = pg_query($strQuery);
      while ($row = pg_fetch_array($query))
      {
      $nome = $row['nome'];
      $telefone = $row['telefone'];
      $endereco = $row['endereco'];
      $nome = $dom->createElement(”nome”, “$nome”);
      $telefone = $dom->createElement(”telefone”, “$telefone″);
      $endereco = $dom->createElement(”endereco”, “$endereco″);
      $contato->appendChild($nome);
      $contato->appendChild($telefone);
      $contato->appendChild($endereco);
      $root->appendChild($contato);
      }

      Seria algo do tipo acima… num post futuro farei isso.

  6. Alexandre disse:

    Olá Rafael,
    Excelente trabalho, mas precisava de um help seu!

    Utilizei essa função em um projeto recente, porém ao obter do bd dados acentuados ocorre o seguinte warning:
    —————————————-
    Erro no processamento de XML: caracteres inúteis após um elemento do documento
    Posição: xml_fichas_export.php
    Número da linha 2, coluna 1:Warning: DOMDocument::save() [function.DOMDocument-save]: output conversion failed due to conv error, bytes 0xC3 0x4F 0×20 0×50 in X:\mowes\www\xml_fichas_export.php on line 192
    ^
    —————————————-

    A linha em questão é sempre exatamente onde está a palavra acentuada. Troquei o padrão para UTF-8 e deu certo, porém o cliente ao importar exige que seja utilizado ISO-8859-1:

    $dom = new DOMDocument(“1.0″, “UTF-8″);
    $dom = new DOMDocument(“1.0″, “ISO-8859-1″);

    Saberia me dizer uma solução para o problema?

    Obrigado!

    • Rafael Clares disse:

      Alexandre,
      já tentou usar o utf8_decode($var) nas palavras/strings/vars com acentos ?
      De toda forma, o caminho é por aí ! Utilize encode/decode das strings/vars que compõe o XML!
      abraços,

  7. Bruno disse:

    Prezado Clares…

    Eu gostaria de aprender inserir um nodo antes (ou depois) de algum outro nodo específico no arquivo xml já existente.

    Tem como me ajudar nessa?

  8. Cadu disse:

    Muito boa a dica! Simples e eficiente!

    Parabéns!

  9. Jose Ricardo disse:

    Saudações…
    Interessante esse exemplo, gostei muito mas estou com um pequeno problema…
    minha aplicação é assim:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $urlapf);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $Resposta = curl_exec($ch);
    curl_close($ch);

    Depois disso, faço o tratamento necessário, separo as devidas informações em variáveis e vizualizo na tela.
    Funcionando tudo blz…
    Quando vou gerar o xml ele não está puxando os valores

    $dado1 = $dom->createElement(“dado1″, “$Dado01″);
    $dado2 = $dom->createElement(“dado2″, “$Dado02″);
    $dados_principais->appendChild($dado1);
    $dados_principais->appendChild($dado2);

    O que pode estar acontecendo?????

  10. Alcir disse:

    como faco para inserir atributos com api DOM

  11. fernando disse:

    bom material amigo

  12. Neto disse:

    Olá,ótimo artigo!
    exatamente o que procurava.

    Abraços.

  13. Diogo disse:

    Oi Rafael, consegui utilizar teu código perfeitamente, está lista até do banco de dados.

    Mas tenho uma dúvida, como faço para apenas exibir as informações e não salvar??

    Abraço.

  14. Carlos Correa disse:

    Excelente, não conhecia essa API, muito prática para criação de conteúdo. Irei utiliza-la para a integração do meu sistema com NFe.
    Valeu pela dica.

    Abraços

  15. Tamar disse:

    cara como o wordpress cria o arquivo xml para feeed(rss), pois não esta mostrando as imagens dos meus post, deve estar faltando alguma linha de código.. grato (papertoyart.com)

  16. Giancarlo disse:

    desculpa ressussitar aki, mas eu to querendo adicionar uma coisa do tipo mas estou com umas dificuldades…se puder ajudar nesse sentido…vlws ae

    • Rafael Clares disse:

      Giancarlo, rs rs nossa cara você pode perguntar à vontade mas confesso que não entendi muito o que quis dizer.
      Bem, me fale o que são as “coisas do tipo” e depois o “sentido” para eu poder tentar ajuda-lo ok, me fale da dificuldade.
      um abraço

  17. dyegoreisa disse:

    Muito prático.
    Me ajudou muito!

  18. Samuel disse:

    Olá, gostei muito deste POST, e aproveitei para mandar um comentário, acessem o site: http://syslep.wordpress.com/, para ver alguns POST de Criação de LOGI com um PACKAGE nos mesmo criamos.

  19. valmir santos disse:

    o legal, muito bom esse post, foi de muito ajuda, obrigado.

  20. panetony disse:

    Rafael,

    seu artigo me ajudou bastante… valeu!

    estou com uma dúvida, e gostaria de saber se você pode me ajudar… é o seguinte… se eu coloco no xml o caracter especial & é salvo como &

    ok… é isso que gostaria que fizesse mesmo…

    porem qdo coloco ” o xml salva como ” e gostaria que salvasse como "

    será que poderia me ajudar com isso ?!

    valeu !

    abraço

  21. Matheus disse:

    Poxa sou novo aqui mas cheguei pra ficar, esse blog é animal mano… muitas dúvidas que eu tinha estão aqui solucionadas, até mesmo uma coisa que eu precisei fazer e com muito custo você explicou aqui perfeitamente e bem fácil.

    Parabéns, continue assim eu gostaria de aproveitar e deixar um pedido…

    POR FAVOR, FAÇA MAIS AULAS DE XML COM PHP POR FAVOR…..

    Valeu

  22. Raphael disse:

    Ele quer saber se deve colocar & ou & para exibir o “&”
    No caso, o correto seria & creio eu.

  23. Erick Menezes disse:

    Boa Eu nao to conseguindo salvar ele exibe no firefox e no Ie normal mas nao salva no servidor
    to rodando IIS 5.1 aki tem que configurar permição de pasta para gravar ? ja tentei de varias formas mas nada
    OBS: as duas ultimas linhas eu ja tentei das duas formas com echo e sem mas nada

    createElement(“enviar”);
    $tipoElm = $document->createElement(“tipo”, $tipo);
    $nomeElm = $document->createElement(“nome”, $nome);
    $endElm = $document->createElement(“endereco”, $end);
    $cmdElm = $document->createElement(“cmd”, $cmd);
    $contato->appendChild($tipoElm );
    $contato->appendChild($nomeElm);
    $contato->appendChild($endElm);
    $contato->appendChild($cmdElm);
    return $contato;
    }
    $dom = new DOMDocument(“1.0″, “ISO-8859-1″);
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $root = $dom->createElement(“comando”);
    $escrever = addContato($dom, “Tipo0″, “MRmenezes”, “0″, “TELNET”);
    $root->appendChild($escrever);
    $dom->appendChild($root);
    header(“Content-Type: text/xml”);
    print $dom->saveXML();
    echo $dom->save(“cmd.xml”);
    $dom->save(“agenda.xml”);
    ?>

    • Rafael Clares disse:

      Erick, no IIS 5 não sei te dizer ao certo cara mas tente passar o caminho absoluto de onde quer salver para fazer um teste. ex: $dom->save(“c:\\temp\\agenda.xml”);
      De toda forma tente me passar alguma mensagem de erro se houver alguma sendo exibida!

  24. Tiago Sutil disse:

    Não to conseguindo salvar o arquivo ele da esse erro de permissão negada, por fazvor se conseguir me ajudar eu agradesso. Ja tentei colocar o caminho por extenso, tentei com

    $dom -> save ( $_SERVER [ 'DOCUMENT_ROOT' ]. ‘eventos.xml’ );

    o erro é sempre o mesmo

    Warning: DOMDocument::save(/dados/www/dominios/htdocs/nosite/www.nosite/eventos.xml) [function.DOMDocument-save]: failed to open stream: Permission denied in /dados/www/dominios/htdocs/nosite/www.nosite/geraxmleventos.php on line 53

    • Rafael Clares disse:

      Tiago, permissão você dá na pasta onde está tentando salvar… tem que dar permissão de gravação, se estiver hospedado em algum local, você muda a permissão pelo FTP, alterando para 0776 a permissão da pasta.

      • Tiago Sutil disse:

        Eu consegui dando a permissão 777. Vlw otimo post.

        Fujindo do proposto gostaria de trocar ideias uma hora dessas entre a troca de informação entre flash (via java script) chamando em uma paginas em php ou html… Depois de muito fazer ainda bato a cabeça com o IE, tipo ele so funciona com o modo de compatibilidade ativado.

        Bom vlw. Abrass

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s