Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tagostinho

[Resolvido] Busca em arquivos XML com PHP via Xpath

Recommended Posts

Fiz um sisteminha de agenda onde os dados são armazenados em um arquivo XML. Implementei o Xpath para fazer a busca de dados.

 

É possível escolher o tipo de busca que quer fazer, seja pelo nr do telefone, do celular ou pelo nome. No caso do nome o valores só são retornados se digitar o nome corretamente (case sensitive).

 

Gostaria de buscar os nomes como fazemos com o comando like (%texto%) do mysql; ao digitar uma parte do texto me retornar todos os nós que contém aquela parte.

 

Arquivo XML

 

<?xml version="1.0" encoding="utf-8"?>
<agenda>
	<dados id="1" nome="Fulano de Tal" tel="(XX) 1234-5678" cel="(XX) 9999-0000" email="fulano.tal@email.com.br"/>
	<dados id="2" nome="Ciclano 2" tel="(XX) 1234-5678" cel="(XX) 0000-0000" email="ciclano@email.com.br"/>
	<dados id="3" nome="Fulano 3" tel="(XX) 1234-5678" cel="(XX) 0000-0000" email="ciclano@email.com.br"/>
	<dados id="4" nome="Fulano 4" tel="(XX) 1111-1111" cel="(XX) 0000-0000" email="ciclano@email.com.br"/>
	<dados id="5" nome="Fulano 5" tel="(XX) 2222-2222" cel="(XX) 0000-0000" email="ciclano@email.com.br"/>
	<dados id="6" nome="Fulano 6" tel="(XX) 6666-6666" cel="(XX) 0000-0000" email="ciclano@email.com.br"/>
</agenda>

Arquivo PHP

 

                switch ($valor_selecionado){
				case "nome":
					$result = $xml->xpath("dados[@nome=\"$txt_digitado\"]");
					break;
				case "tel":
					$result = $xml->xpath("dados[@tel=\"$txt_digitado\"]");				
					break;
				case "cel":
					$result = $xml->xpath("dados[@cel=\"$txt_digitado\"]");				
					break;
		} 
	
		$conta_result = count($result);

		// verifica se o array possui dados
		if ($conta_result != 0)
		{
			echo "<table border=0 cellpadding='5' id='tbResultados'>"; 
			echo "<tr>"; 
			echo "<td class='tbTitulo'>Id</td>"; 
			echo "<td class='tbTitulo'>Nome</td>"; 
			echo "<td class='tbTitulo'>Telefone</td>";
			echo "<td class='tbTitulo'>Celular</td>";
			echo "<td class='tbTitulo'>Email</td>";	
			echo "<td class='tbTitulo1'>Editar</td>";	
			echo "<td class='tbTitulo1'>Excluir</td>";					
			echo "</tr>";  
	
			// montando a tabela com os dados do arquivo xml
			foreach ($result as $dados)
			{
				echo "<tr>";  
				echo "<td valign='top'>" . $dados['id'] . "</td>";  
				echo "<td valign='top'>" . $dados['nome'] . "</td>";  
				echo "<td valign='top'>" . $dados['tel'] . "</td>";  
				echo "<td valign='top'>" . $dados['cel'] . "</td>";  
				echo "<td valign='top'>" . $dados['email'] . "</td>";
				echo "<td valign='top' align='center'><a href=\"index.php?action=edt&id=$dados[id]\" id='btnEditar'><img src='imagens/btn-edit.gif' border='0' /></a></td>";
				echo "<td valign='top' align='center'><a href=\"index.php?action=del&id=$dados[id]\"><img src='imagens/btn-del.gif' border='0' /></a></td>";
				echo "</tr>";
			}
			echo "</table>";
			echo "<br />";
			echo "<p class='alert'><a href='index.php'>Voltar</a></p>"; 
		}
		else
		{
			echo "<p class='alert'>Contato não cadastrado!</p>";	
			echo "<p class='alert'><a href='index.php'>Voltar</a></p>";						
		}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@tagostinho,

 

Está dando algum tipo erro ?

Alguma coisa não está funcionando como o esperado ?

 

Fiz o teste aqui e está ok:

<?php
$tipo = 'email';
$valor = 'fulano.tal@email.com.br';

$dom = new DOMDocument();
$dom->load( 'test.xml' );
$xpath = new DOMXPath( $dom );

foreach( $xpath->query( sprintf( './/dados[@%s="%s"]' , $tipo , $valor ) ) as $node ){
var_dump( $node->getAttribute( 'nome' ) );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá João,

 

não está dando erro, porém as buscas por nome só retornam dados se for informado como está cadastrado. Tem que informar os caracteres maiúsculos, acentos etc, senão não retorna os dados.

 

O exemplo que você passou é um pouco diferente, você está usando dom e no meu caso eu uso simplexml.

 

Tiago

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema resolvido:

 

Para efetuar a busca que estava querendo, tive que alterar alguns parâmetros para que funcionasse.

 

A linha abaixo só retornava os valores digitados corretamente; tinha que digitar o nome completo com maiúsculo, etc.

 

$result = $xml->xpath("dados[@nome=\"$txt_digitado\"]");

Segue a linha com a solução para buscar dados tipo string no seu arquivo XML:

 

 $LowerCase='abcdefhijklmnopqrstuvwxyz';
 $UpperCase='ABCDEFGHIJKLMNOOPQRSTUVWXYZ';
 $result = $xml->xpath("dados[contains(translate( @nome,'$UpperCase', '$LowerCase'), '$txt_digitado')]");

Explicando:

contains: verifica se o texto digitado ($txt_digitado) contém no atributo nome (@nome) do nó dados.

translate: utilizado para converter os caracteres maiúsculos em minúsculos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá tagostinho

 

Utilizei o codigo para fazer uma pesquisa em uma playlist em xml, mas não me mostra os registos do arquivo, será que voce poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.