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
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Cara, como seria para LER um arquivo XML ?
Comentário por Michel Março 3, 2008 @ 6:30 pmOlá Michel, Leia em http://clares.wordpress.com/2008/08/17/ler-xml-com-php/
Comentário por clares Março 3, 2008 @ 7:08 pmCara, 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.
Comentário por Laerti Borba Maio 18, 2008 @ 6:49 pmLaerti
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 Junho 25, 2008 @ 4:13 pmShow de bola!!
Comentário por Glauber Dezembro 28, 2008 @ 7:52 pmParabéns!!
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 Fevereiro 19, 2009 @ 5:26 pmGabriel, 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 Fevereiro 20, 2009 @ 12:12 amOlá 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 Maio 7, 2009 @ 1:00 pmAlexandre,
Comentário por Rafael Clares Maio 7, 2009 @ 1:05 pmjá 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,
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 Junho 22, 2009 @ 1:44 pmOlá 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 Junho 23, 2009 @ 1:20 amMuito boa a dica! Simples e eficiente!
Parabéns!
Comentário por Cadu Setembro 25, 2009 @ 12:52 pmSaudaçõ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 Outubro 1, 2009 @ 1:37 pmOlá Jose Ricardo, então amigo para ajuda-lo eu precisaria saber de onde vem o $Dado01 e $Dado02.
Comentário por Rafael Clares Outubro 5, 2009 @ 10:40 amJá 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/