Olá,
Mais um exemplo de como gerar XML com PHP5, neste caso iremos utilizar a Classe nativa do PHP5 o XMLWriter para gerar a saída XML formatada.
Este exemplo, sem dúvidas é bem mais simples que o anterior que utiliza o DOM ou SimpleXML.
Vejamos o código:
<?
# Instancia do objeto XMLWriter
$xml = new XMLWriter;
# Cria memoria para armazenar a saida
$xml->openMemory();
# Inicia o cabeçalho do documento XML
$xml->startDocument( '1.0' , 'iso-8859-1' );
# Adiciona/Inicia um Elemento / Nó Pai <item>
$xml->startElement("item");
# Adiciona um Nó Filho <quantidade> e valor 8
$xml->writeElement("quantidade", 8);
# Adiciona um Nó Filho <preco> e valor 110
$xml->writeElement("preco", 110);
# Finaliza o Nó Pai / Elemento <Item>
$xml->endElement();
# Configura a saida do conteúdo para o formato XML
header( 'Content-type: text/xml' );
# Imprime os dados armazenados
print $xml->outputMemory(true);
# Salvando o arquivo em disco
# retorna erro se o header foi definido
# retorna erro se outputMemory já foi chamado
$file = fopen('foo.xml','w+');
fwrite($file,$xml->outputMemory(true));
fclose($file);
?>
Obs: A chamada ao método $xml->outputMemory() descarrega os dados da memória então você só consegue chama-lo uma vez, logo, para salvar o arquivo você não pode ter chamado este método ainda.
Para salvar o arquivo corretamente você deve comentar as linhas abaixo:
# header( ‘Content-type: text/xml’ );
# print $xml->outputMemory(true);
Comente as linhas abaixo para apenas exibir o XML no browser:
# $file = fopen(‘foo.xml’,'w+’);
# fwrite($file,$xml->outputMemory(true));
# fclose($file);
Referência: http://br.php.net/manual/pt_BR/book.xmlwriter.php
Por enquanto é isso galera, bom divertimento e até mais.
Efetuando uma busca em um arquivo XML utilizando PHP5
Vimos em um outro post como ler um arquivo XML utilizando o SimpleXML, agora veremos como efetuar uma busca dentro de um arquivo XML.
Gerar, ler e transportar dados através em XML se tornou algo padrão em qualquer software seja on-line ou não. A partir disso podemos pensar:
- Antes de enviar dados em XML nós selecionamos adequadamente o que ele irá transportar.
Legal, é assim mesmo, nós selecionamos os dados do BD, geramos o XML e enviamos ou disponibilizamos para outro software.
Ok, mas e o software que vai receber esses dados? Ele não sabe o que está recebendo, não é?
Então pensando nisso nós escreveremos agora o código em PHP que terá o objetivo de ler o conteúdo do XML e selecionar apenas o que lhe interessa, assim como acontece na geração do arquivo.
A idéia a princípio e como todas as demais contidas nesse bloguinho é muito simples e servirá para que vocês possam a partir disso desenvolver linhas de raciocínios melhores ;)
Bem, a idéia é parecida com a do outro post, por isso aconselho dar uma lida nele antes.
Considerando que você acabou de ler o post sobre SimpleXML vamos começar o arquivo XML.
chamamos o arquivo de estante.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>50.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>150.00</preco>
</livro>
<livro>
<cod>03</cod>
<titulo>Javascript</titulo>
<descricao>O Poder do javascript</descricao>
<autor>Billy Borny</autor>
<paginas>80</paginas>
<preco>90.90</preco>
</livro>
</livros>
Como pode perceber o conteúdo do XML são livros e suas propriedades, então
Na tag “livros” possui 3 tags “livro” ou seja “livros” é a raiz e “livros” são o que chamamos de “nós“,
para cada tag livro existe o cod, titulo, descricao, autor, paginas e preco, o último é justamente o que iremos utilizar em nosso exemplo, iremos selecionar livros do XML de acordo com o preço que especificarmos.
Para isso precisamos ler o XML e fazer a seleção de acordo com os parâmetros que escolheremos.
o arquivo principal chamei-o de index.php mas você pode chamar de pamela.php se quiser.
<?php
# Carrega e armazena o XML na variavel $xml
$xml = simplexml_load_file(“estante.xml”);
# laço dentro da tag livro para cada tag livro que encontrar
foreach($xml->xpath(‘//livro‘) as $livro)
{
# armazena na var $registro o conteudo de uma tag livro
$registro = simplexml_load_string($livro->asXML());
# executa uma consulta XPath e armazena em $busca
$busca = $registro->xpath(‘//preco[.>55.00]‘);
# verificando se houve alguma busca com sucesso
if($busca){
# exibindo os resultados encontrados
echo $livro->titulo . “<br>”;
echo $livro->descricao . “<br>”;
echo $livro->preco . “<br><br>”;
}
}
?>
Acho que tem pouco para explicar sobre o PHP devido os comentários do código.
Mas, básicamente o que ocorre é que nós após carregarmos o arquivo XML efetuamos na linha
$busca = $registro->xpath(‘//preco[.>55.00]‘);
a seguinte verificação:
- procure dentro das tags livro onde o preco seja maior que 55.00, se reparar no arquivo XML irá perceber que somente 2 livros (nós) atendem à nossa condição e são eles que são exibidos como resultado. Neste caso estamos exibindo somente o título, descrição e preço, claro que podemos exibir todo o conteúdo do livro.
Muito díficil não é? Pois é …
Acredito que vale a pena se aprofundar nessa idéia de transporte de dados com XML, além de ser muito prático permite que dados de uma aplicação seja fácilmente integrados à qualquer outro sistema e esse parece ser o futuro do software, quando se fala em integração de sistemas não dá para pensar em outra coisa que não seja XML.
seguem alguns links:
- Post | Criando XML com PHP
- Post | Lendo XML com PHP
- Docs | SimpleXML | Consultas Xpath
- Exemplo | busca em xml
- Download | busca em xml – fontes
Aproveite para responder essa…
Àté a próxima,
abraços
Rafael Clares,
Lendo um diretório com PHP, gerando um XML contendo o nome das fotos e exibindo com Flash.
A galeria consiste em uma animação Flash que lê um arquivo XML contendo o caminho e nome das fotos, então imaginei que poderíamos criar uma pequena rotina em PHP que fosse capaz de ler um diretório recuperar o nome dos arquivos de fotos e a partir disso gerar um XML com os dados. Isso nos faz evitar ter que editar o XML a cada foto nova, assim, basta jogar a foto dentro do diretório e pronto.
Vejam os prints da Galeria, não acho que seja algo para um sistema, mas ficaria muito bacana em um site.
Vocês só vão entender quando ver funcionado. Veja o exemplo on-line aqui.
Você pode arrastar as fotos mantendo pressionado o botão do mouse.
Para exibir/ampliar uma foto utilize o duplo click sobre a foto,
o mesmo deve acontencer para que ela seja minimizada.
Pessoal após ter liberado o download estou informando uma alteração que foi feita, o PHP agora verifica a extensão dos arquivos no diretório e caso a extensão não esteja no array $exts do arquivo PHP o arquivo lido não será adicionado ao XML,
Portanto, adicione as extensões que deseja na galeria na linha abaixo:
$exts = array(‘jpg’,'png’,'jpeg’,'gif’); // 5º linha do arquivo PHP
Abraços,
Download do pacote atualizado e corrigido
Rafael Clares,
Pessoal tenho visto pela web muitas formas de inserir notícias em uma página utilizando RSS/XML, muitas dessas formas funcionam bem em qualquer situação e outras não. Resolvi postar aqui uma das que funcianam bem, claro, além de ser de simples alteração.
O arquivo abaixo retorna apenas os links das notícias, então o que vocês precisam fazer nada mais é que mudar o valor da var $feed inserindo a URL que desejar, a váriavel $qtdelinks informa a quantidade de links de notícias que retornarão ao fim das instruções, você pode mudar seu valor também.
Escolha um local em seu site e use include(‘feeds.php’); para incluir os links no site!
Salve-o como feeds.php
<?php
# Iniciando as variaveis
# Url do RSS / Feed
$feed = ‘http://feeds.folha.uol.com.br/folha/mundo/rss091.xml‘;
# Quantidade de links que serão exibidos
$qtdelinks=5;
# Variavel que aramazena os links
$html = ”;
# Variavel utilizada no laço x quantidade de links (set)
$i=0;
# Variavel que recebe os dados do url
$xml = ”;
# Abrindo o arquivo remoto
$fp = fopen($feed, ‘r‘);
while (!feof($fp))
{
# Armazenando o conteudo do arquivo na variavel XML
$xml .= fread($fp, 128);
}
# Fechando o arquivo
fclose($fp);
# Função que captura o conteudo das Tags
function untag2($string, $tag)
{
$tmp = array();
# Informando as tags passadas no parametro para obter o conteudo
$preg = “|<$tag>(.*?)</$tag>|s”;
# Obtendo o conteudo das tags passadas no param e adicionando em tags
preg_match_all($preg, $string, $tags);
# Para cada tag contida em no array tags
foreach ($tags[1] as $tmptag)
{
# Adicionando no array tmp o conteudo das tags
$tmp[] = $tmptag;
}
# Retornando um array com conteudo de cada tag
return $tmp;
}
# Retornando o conteudo de todas as tags item do RSS / XML
$items = untag2($xml, ‘item‘);
# Retornando cada tag item do array items
foreach ($items as $item)
{
if ($i < $qtdelinks)
{
# Recuperando o conteudo da tag title
$title = untag2($item, ‘title‘);
# Recuperando o conteudo da tag href / link
$link = untag2($item, ‘link‘);
# Armazenando o link na var html / utf8_decode trata os acentos no titulo
$html .= ‘<a href=”‘.$link[0].‘” target=”_blank”>’.utf8_decode($title[0]).”</a><br>\n“;
$i++;
}
}
# Exibindo o HTML gerado
echo $html;
?>
Utilize o CSS do seu site para formatar os links, não precisa alterar nada na variável($html) que concatena os links. Se preciso adicione apenas o atributo Class (se seu css já não estiver tratando todas as tags A href).
É isso aí, apenas.
O exemplo funcionando aqui. Download do exemplo funcionando aqui.
Obrigado,
Rafael Clares
Lendo um arquivo XML com o PHP5
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
<?
#carrega o arquivo XML e retornando um Array
$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 utf8_decode($livro->titulo);
echo utf8_decode($livro->autor);
echo utf8_decode($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> “ .utf8_decode($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 Array, se quiser ver o formato desse array criado pela função e atribuído à variável $xml, utilize a função do PHP print_r que serve para exibir um array na tela. 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
Documentação do utf8_decode: utf8_decode
Abraços e até o próximo post. ;)
Gráficos 3D Animados com PHP + XML + Flash
Olá Galera, após ter falado um pouco sobre gráficos com o PHPlot, na sequência estou apresentando maravilhoso gráfico gerado com o FusionCharts, esse cara aí nos permite criar belíssimos gráficos em flash!
O FusionCharts é um produto comercial, eu já tinha utilizado em uma outra ocasião porém não me recordo de terem uma versão free, mas a alguns dias entrei no site da FC e meus olhos brilharam com o anúncio ”Free Version” !
Chega de conversa, eu me empolguei ! ; )
O FusionCharts permite gerar gráficos nas liguagens PHP, ASP, CSNET, VBNET e Javascript, em todos os casos você pode setar através dos métodos do FC os valores para o gráfico, porém existe a forma que acredito ser a mais simples e prática para o exemplo que é através de XML. Podemos criar um arquivo xml com os dados desejados e informar na aplicação o endereço do XML ou podemos apenas criar no próprio código uma variável com os dados do XML, a segunda opção seria ideal no caso de ler uma tabela do banco.
Exemplo do XML para um gráfico de barras:
E básicamente é apenas disso que precisamos enviar para a o arquivo PHP e Flash.
A linha 1 do XML contém o o atributo xAxisName que repesenta as colunas do gráfico e também o atributo yAxisName que representa as linhas do gráfico, observe no gráfico abaixo:
O XML pode receber mais parâmetros na primeira linha, como título do gráfico e outros, consulte os docs.
Agora que já vimos que precisamos de um XML e sabemos como deve ser sua estrutura, vamos para o PHP.
Primeiro exemplo
- Usando um arquivo XML – Precisamos dos seguintes diretórios e arquivos:
- diretório data e dentro dele o arquivo xml chamado dados.xml (como o do exemplo)
- diretório charts com os arquivos flash que recebem o XML e geram o gráfico
- diretório includes com os arquivos FusionCharts.php e fusioncharts.js
Importante saber que essa estrutura de arquivos e diretório são usadas especificamente neste exemplo devido eu ter adaptado de forma que fosse mais fácil compreender e trabalhar, de outra forma, a estrutura utilizada nos exemplos que vem no pacote do Fusioncharts é um pouquinho diferente mas nada de complicado fique tranquilo, você vai olhar e entender de cara. ;)
Então voltando ao assunto principal, com essa estrutura de diretórios e seus respectivos arquivos precisamos apenas do arquivo PHP com as linhas abaixo.
<script language=”javascript” src=“charts/fusioncharts.js”></script>
<?php
#incluindo o arquivo FC
include(“includes/FusionCharts.php“);
#metodo que renderiza o grafico na tela
echo renderChart(“charts/FCF_Column3D.swf“, “data/dados.xml“, “”, “graf“, 600, 300);
?>
Acredite se quiser, com essa linha javascript e mais as 2 linhas PHP nós geramos o gráfico da imagem acima!
Como não há praticamente nada no arquivo PHP irei explicar apenas a linha que nos importa, a última linha.
echo renderChart(“charts/FCF_Column3D.swf“, “data/dados.xml“, “”, “graf“, 600, 300);
Após incluirmos o arquivo FusionCharts na primeira linha do PHP nós chamamos a função renderChart que recebe alguns parâmetros e são eles na ordem:
1 parâmetro – caminho para o arquivo flash que irá gerar o gráfico.
2 parâmetro – caminho do arquivo XML que contém os dados que queremos exibir.
3 parâmetro – vazio, seria utilizado se ao invés de um arquivo estivessemos passando uma variável, neste caso o parâmetro vazio seria o segundo que contém o caminho do arquivo.
4 parâmetro - nome do gráfico, dê o nome que quiser.
5 e 6 parâmetros – respectivamente largura e altura do gráfico na tela, altere como quiser.
Simples não?
Segundo exemplo
- Usando/concatenando uma váriavel PHP para gerar o XML
<script language=”javascript” src=“charts/fusioncharts.js”></script>
<?php
$strXML = “<graph xAxisName=’Meses’ yAxisName=’Acessos’>“;
$strXML .= “<set name=’Jan’ value=’462′ color=’AFD8F8′ />“;
$strXML .= “<set name=’Fev’ value=’857′ color=’F6BD0F’ />“;
$strXML .= “<set name=’Mar’ value=’671′ color=’8BBA00′ />“;
$strXML .= “<set name=’Abr’ value=’494′ color=’FF8E46′/>“;
$strXML .= “<set name=’Mai’ value=’761′ color=’008E8E’/>“;
$strXML .= “<set name=’Jun’ value=’960′ color=’D64646′/>“;
$strXML .= “<set name=’Jul’ value=’629′ color=’8E468E’/>“;
$strXML .= “<set name=’Ago’ value=’622′ color=’588526′/>“;
$strXML .= “<set name=’Set’ value=’376′ color=’B3AA00′/>“;
$strXML .= “<set name=’Out’ value=’494′ color=’008ED6′/>“;
$strXML .= “<set name=’Nov’ value=’761′ color=’9D080D’/>“;
$strXML .= “<set name=’Dez’ value=’960′ color=’A186BE’/>“;
$strXML .= “</graph>“;
include(“includes/FusionCharts.php“);
echo renderChart(“charts/FCF_Line.swf“, “”, $strXML, “chart1“, 600, 300);
?>
Notem que as mudanças são:
- Ao invés de utilizarmos um arquivo XML, nós criamos e concatenamos a variável strXML com os valores requeridos no arquivo XML, como podem ver a estrutura do XML não muda, temos o atributo name que se refere à coluna o value que corresponde à altura da barra no gráfico e color que possui a cor em hexadecimal da barra.
- Já na função renderChart, o segundo parâmetro está vazio e o terceiro possui a variável strXML assim como comentei mais acima, relembrando…
O segundo parâmetro é vazio quando passamos à função renderChart uma váriável php e o terceiro parâmetro é vazio quando passamos um arquivo XML.
Notem também que o nome do arquivo flash informado no primeiro parâmetro mudou, isso pq o FC dispoem de diversos tipos de gráficos que utilizam a mesma estrutura XML, deem uma vasculhada nos exemplos contidos na documentação do FC para ver os tipos de gráficos disponíveis. O arquivo flash utilizado neste exemplo irá gerar exatamente o gráfico abaixo:
Quando os gráficos que são gerados eles são animados, daí o flash. O FC É perfeito e estamos falando apenas das funções básicas da versão free, se quiserem se impressionar ainda mais olhem a versão comercial do FC, é de brilhar os olhos! ;)
Links:
FusionCharts vs. free: http://www.fusioncharts.com/free/Download.asp?gMenuItemId=5
Nosso exemplo em ação e mais tipos de gráficos com o mesmo XML: Exemplo
Tá legal, foi fácil entender o exemplo mas vocês terão que estruturar os diretórios como mostrei para que esses códigos do exemplo possam funcionar, a dica que dou é …
Baixe o FC e explore sua estrutura de arquivos. Verá que você não precisa fazer exatamente como eu fiz, teste os exemplos contidos no pacote mesmo. Se quiser a que eu modifiquei apenas para testes do exemplo acima, deixe um comentário aí que te mando por email, não quero colocar o link aqui! Mas não deixe de baixar o pacote completo do FC.
Últimas considerações:
- Se pretende colocar seu exemplo em um servidor linux não esqueça que o Linux entende FusionCharts e fusioncharts como 2 diretórios diferentes, ou seja, digamos que ele é CaSe sEnSiTiVe.
- Não deixe de explorar os métodos utilizados pela classe PHP, nesse exemplo não trabalhamos com a classe em si e seus métodos como no exemplo do PHPlot !
- Depois me arrisco em um post para mostrar um exemplo utilizando BD.
Abraços e até mais,
Rafael Clares
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




