Busca em XML com PHP

  • Autor do post:
  • Categoria do post:PHP DEV

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,

Este post tem 22 comentários

  1. Paulo Afonso

    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!

    1. Rafael Clares

      Entedi Paulo, leia sobre o simplexml_import_dom e simplexml_load_string no php.net. Lá tem a solução que você precisa.

  2. Paulo

    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.

  3. Paulo

    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

  4. Rafael Clares

    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

  5. alvim

    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!

  6. Rodrigo Macoy

    Muito boa a sua pagina,consigo resolver e tirar duvidas que levaria horas de estudo pra solucionar parabéns mesmo pelo seu site

  7. valmir

    Nossa muito bom este artigo, foi direto ao ponto e de maneira muito simples.

    obrigado pelo artigo, e tudo de bom e sucesso

  8. Élida M.

    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

    1. Rafael Clares

      É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.

  9. Raphael Schubert

    cara… segue meu codigo…

    &lt;?php
    $action = $_REQUEST[&quot;action&quot;];
    
    switch ($action){
    
    	case 'search':
    
    		$k = $_REQUEST[&quot;k&quot;];
    
    		if(file_exists('faq.xml')){
    
    			$xml = simplexml_load_file('faq.xml');
    		}
    
    		foreach($xml-&gt;xpath('//pergunta') as $pergunta){
    			$registro = simplexml_load_string($pergunta-&gt;asXML());
    			$busca = $registro-&gt;xpath(&quot;//cod[002]&quot;);
    			if($busca){
    				echo utf8_decode($pergunta-&gt;titulo);
    				echo utf8_decode(&quot;&lt;br&gt;&quot;);
    				echo utf8_decode($pergunta-&gt;resposta);
    				echo utf8_decode(&quot;&lt;br&gt;&lt;br&gt;&quot;);
    			}
    		}
    
    	break;
    
    	default;
    
    		if(file_exists('faq.xml')){
    			$xml = simplexml_load_file('faq.xml');
    		}
    
    		foreach($xml-&gt;pergunta as $pergunta){
    			echo utf8_decode($pergunta-&gt;titulo);
    			echo utf8_decode(&quot;&lt;br&gt;&quot;);
    			echo utf8_decode($pergunta-&gt;resposta);
    			echo utf8_decode(&quot;&lt;br&gt;&lt;br&gt;&quot;);
    		}
    
    	break;
    }
    ?&gt;

    mas não está pesquidando… por que será?

  10. Raphael Schubert

    Opa… arrumei… era so trocar esta linha:

    $busca = $registro-&gt;xpath(&quot;//cod[002]&quot;);

    Por esta:

    $busca = $registro-&gt;xpath(&quot;//cod[.=002]&quot;);

    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?

  11. lucas almeida

    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.

  12. Guilherme Velloso

    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

  13. Guilherme Velloso

    Sem problema Rafael, agradeço mesmo assim a resposta. 😉
    Abração

  14. Everson Vansoski

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

    1. Rafael Clares

      hahahahha
      ASP Everson, rapaz isso não é da minha época não!
      ABs

      1. Everson Vansoski

        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!

Os comentários estão encerrados.