Rafael Clares


Gerar XML com PHP
Fevereiro 10, 2008, 1:16 am
Arquivado 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.

<?php
#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”);

#criando e setanto o nomes e atributos dos elementos xml (nós)
$nome = $dom->createElement(“nome”, “Rafael Clares”);
$telefone = $dom->createElement(“telefone”, “(0xx11) 5500-0055″);
$endereco = $dom->createElement(“endereco”, “Av. longa n 1″);

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

#adiciona o nó contato no  nó superior (root) agenda
$root->appendChild($contato);
$dom->appendChild($root);
$dom->save(“contatos.xml”); #salvando o arquivo xml
header(“Content-Type: text/xml”); #cabeçalho da página
echo $dom->saveXML(); # imprime o xml na tela
?>

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, $telefone, $endereco) {
$contato = $document->createElement(“contato”); #criar contato
$nomeElm = $document->createElement(“nome”, $nome); #criar nome
$telefoneElm = $document->createElement(“telefone”, $telefone); #telefone
$enderecoElm = $document->createElement(“endereco”, $endereco); #endereco

$contato->appendChild($nomeElm);
$contato->appendChild($telefoneElm);
$contato->appendChild($enderecoElm);

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
$contatoPaulo = addContato($dom, “Paulo J.”, “(11) 5555-4444″, “Av. Principal, 80″);
$contatoJoao = addContato($dom, “Joao S.”, “(11) 4444-5555″, “R. da Feira, 70″);

#adicionando no root
$root->appendChild($contatoPaulo);
$root->appendChild($contatoJoao);

$dom->appendChild($root);
$dom->save(“agenda.xml”); #salvando o arquivo

header(“Content-Type: text/xml”);
echo $dom->saveXML(); #mostrar dados na tela
?>

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

Até a próxima,

Rafael Clares 


14 Comentários até o momento
Deixe um comentário

Cara, como seria para LER um arquivo XML ?

Comentário por Michel

Olá Michel, Leia em http://clares.wordpress.com/2008/08/17/ler-xml-com-php/

Comentário por clares

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

Comentário por Laerti Borba

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.

Comentário por Ivaldo Trentin

Show de bola!!
Parabéns!!

Comentário por Glauber

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.. ;)

Comentário por Gabriel Lau

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.

Comentário por Rafael Clares

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 0×4F 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!

Comentário por Alexandre

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,

Comentário por Rafael Clares

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?

Comentário por Bruno

Olá Bruno, dê uma olhada nesse link:
http://us2.php.net/manual/pt_BR/function.simplexml-element-addChild.php
tem o que vc procura.

abs

Comentário por Rafael Clares

Muito boa a dica! Simples e eficiente!

Parabéns!

Comentário por Cadu

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?????

Comentário por Jose Ricardo

Olá Jose Ricardo, então amigo para ajuda-lo eu precisaria saber de onde vem o $Dado01 e $Dado02.
Já tentou utilizar outro exemplo para gerar o XML?
Veja se consegue com esse http://clares.wordpress.com/2009/09/29/gerar-xml-com-php5-e-xmlwriter/

Comentário por Rafael Clares




Deixe um comentário
Linhas e parágrafos quebram automaticamente, endereços de email não serão mostrados, HTML permitido: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>