Efetuando uma busca em um arquivo XML utilizando PHP5
Busca em XML com PHP
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
Àté a próxima,
abraços
Rafael Clares,
Cara, muito bom seu post e seu blog tbm.
Mas eu quero te fazer uma pergunta é uma dúvida minha.
Cara eu tenho uma página que gera o xml, mas para gerar preciso passar alguns parametros.
Dai fica a questão. Não consigo acessar esse XML sem antes passar paramêtros. Daí então não consigo somente usar essa função simplexml_load_file() pois dá a mensagem de erro: falta os paramêtros.
Tem alguma idéia de como me ajudar??
Valeu, Parabéns!
Entedi Paulo, leia sobre o simplexml_import_dom e simplexml_load_string no php.net. Lá tem a solução que você precisa.
achei uma função em curl.
Mas na hora de retornar veio como texto.
Veio as informações todas juntas, não consegui associar o que é o que.
Vou continuar tentando.
Paulo, envia o arquivo que gera o XML no meu email ([email protected]), verei se posso te ajudar. Abraços
Ow nossa… eu criei um arquivo xml após o retorno e depois usei a função de ler… dai ficou mais facil.. pois eu estou manipulando o xml…
mas valeu cara pela ajuda…
tudo de bom
feliz natal
Ué Paulo, eu tinha te falado isso, passar seus parametros para gerar o xml, criar em arquivo, carregar, manipular, apagar xml e vc disse que não se tratava disso rs… Blz então…flw
muito bom o script!tá de parabéns! só queria saber uma coisa, como faz pra deixar o fundo do menu transparente? pois notei que ele é sempre branco! vlw!
Alvim, a transparencia não está contida nas imagens (gif), basta colocar gif com transparencia.
http://www.iconfinder.net/
abraços
Muito boa a sua pagina,consigo resolver e tirar duvidas que levaria horas de estudo pra solucionar parabéns mesmo pelo seu site
Nossa muito bom este artigo, foi direto ao ponto e de maneira muito simples.
obrigado pelo artigo, e tudo de bom e sucesso
Boa tarde Rafael
Sou iniciante em php e xml,
Estou tentando criar um arquivo php que lê parâmetros de um arquivo xml, para em seguida utilizar os dados para conexão com um banco de dados.
Basicamente, o arquivo XML contém 4 tags: nome do servidor, nome do banco, usuário, senha.
O arquivo php inicia carregando o xml e buscando os dados em casa tag, à maneira como você descreveu no artigo.
Porém a função simplexml_load_file não está lendo…
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity “config.xml”
Pode me dar um auxílio?
Muito obrigada!
Élida
Élida, parece que não esta encontrando o arquivo no local indicado!
Você pode verificar também se o nome do arquivo está em letras minúsculas como está chamando na função, lembre-se de que se for linux é case sensitive, letras maísculas e minúsculas são tratadas como arquivos diferentes.
Mas primeiro de tudo tente o seguinte:
crie um arquivo chamado php.ini com o conteudo “allow_url_fopen = On” sem aspas, sem tags php, apenas o texto e na primeira linha do arquivo e coloque no diretório da aplicação onde está o arquivo que deve ler o xml.
cara… segue meu codigo…
mas não está pesquidando… por que será?
Opa… arrumei… era so trocar esta linha:
Por esta:
Agora, estou com outro probleminha… como faço pra pesquisar parte do conteudo de uma tag xml… eu tenho em meu XML uma tag resposta dentro de uma tag pergunta… queria que o usuario pesquisasse parte da resposta e o sistema retornasse ela inteira.. mas ele so pesquisa a resposta exata inteira… e n parte dela…. alguem tem uma sugestao?
Oi Rafael, muito bom o seu blog, venho acompanhando e estudando seus posts,
nesse exemplo, se que eu quiser pesquisar no xml pelo título do livro, como faço ?
$busca = $registro->xpath(‘//preco[.>55.00]‘);// aqui pesquisa livros com o preço maior que 55.00
quero pesquisar o livro com o nome PHP para iniciantes.
Fala Lucas, valeu meu brother.
Seguinte, dá um look nesse link, tem tudo aê:
http://php.net/manual/pt_BR/simplexmlelement.xpath.php
Abs
Olá Rafael, como vai?
Primeiro parabéns não só pelo post mas sim pelo site todo!! Muito show o conteúdo…
Sou muito leigo no assunto e estou precisando criar uma pagina de “produtos” que exibe produtos de um xml externo, mas que exiba por exemplo 10 produtos de uma determinada categoria.
Testei o seu código alterando as tags para a do meu xml mas ele retorna vários erros todos iguais…rs
Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: Invalid predicate in C:wampwwwAulasPHPxml.php on line 10
Notei que quando eu mudo o valor de 55.00 para 55,00 que é a forma como meu xml exibe os valores ele da esses erros e quando coloco o ponto ele retorna a pagina em branco sem erros..rs
Sabe me dizer o porque? Se precisar posso mandar a url do xml pra você por email…
Abraços e mais uma vez parabéns!! Estou lendo todos os seus posts sobre XML
Fala Guilherme, obrigado pelo comentário amigo;
Cara, olha o ideal é você dar uma olhada nas docs do PHP, porque sinceramente eu não uso muito o xpath;
Tem vários exemplos lá, veja:
http://php.net/manual/pt_BR/simplexmlelement.xpath.php
Sem problema Rafael, agradeço mesmo assim a resposta. 😉
Abração
cara, mt bom esse post!!!!
trabalho em uma empresa que só tem servidores ASP e estou aprendendo tudo agora…..
teria como fazer o mesmo com ASP??
hahahahha
ASP Everson, rapaz isso não é da minha época não!
ABs
kkkkkkkkkkkk também acho uma falta de vergonha uma multinacional de grande porte(não to zoando) só ter servidores ASP…. mas em fim, estou estudando PHP e seu tópico me ajudou muito!!
valew msm!