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
Cara, como seria para LER um arquivo XML ?
Olá Michel, Leia em http://clares.wordpress.com/2008/08/17/ler-xml-com-php/
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
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.
Show de bola!!
Parabé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.. ;)
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.
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!
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,
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?
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
Muito boa a dica! Simples e eficiente!
Parabéns!
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?????
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/
como faco para inserir atributos com api DOM
bom material amigo
Olá,ótimo artigo!
exatamente o que procurava.
Abraços.
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.
Diogo, basta comentar a linha abaixo:
$dom->save(“contatos.xml”)
abraços
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
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)
cara, eu não sei como o wordpress cria os arquivos para feeds!
Mas se quiser ver como criar feeds, dê uma busca no blog, tem um exemplo básico!
desculpa ressussitar aki, mas eu to querendo adicionar uma coisa do tipo mas estou com umas dificuldades…se puder ajudar nesse sentido…vlws ae
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
Muito prático.
Me ajudou muito!
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.
o legal, muito bom esse post, foi de muito ajuda, obrigado.
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
Rapaz, não entendi muito bem não … você coloca um caracter e quer que apareça outro, é isso?
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
Valeu Matheus, pode deixar vou escrever sim, é que esse mês tem sido muito corrido. abs
Ele quer saber se deve colocar & ou & para exibir o “&”
No caso, o correto seria & creio eu.
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”);
?>
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!
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
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.
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
Obrigado, você me ajudou muito.