quinta-feira, 25 de julho de 2013

Manipulando arquivos XML com PHP - 1/2

Olá Pessoal.
Agora aprenderemos um pouco sobre a manipulação de arquivos XML com PHP.
Veremos como criar e ler este tipo de arquivo que cada vez mais está presente na web e na comunicação entre sistemas e plataformas.
Nossos exemplos serão baseados na biblioteca SimpleXML



# 1. INICIALMENTE VEREMOS UM PEQUENO EXEMPLO DE CRIAÇÃO XML COM PHP




<?php

$string = "<?xml version=1.0 encoding=\"UTF-8\"?>
            <raiz>
            <linguagem>
<escola>
                  FALE Idiomas
</escola>
              <idioma>
                  Madarin
              <idioma>
            </linguagem>
           </raiz>";

# AGORA CRIAMOS NOSSO XML A PARTIR DA STRING
$xml = new SimpleXMLElement($string);

# SALVAMOS O ARQUIVO EM UM DIRETÓRIO DESEJADO E PRONTO! TEMOS NOSSO 1º XML
$xml -> saveXML('diretorio/arquivo.xml');


#----------------------------------------------------------------#
# 2. EXEMPLO SIMPLES DE CRIAÇÃO A PARTIR DE UMA CONSULTA AO BANCO
DE DADOS
 $host     = 'localhost';
 $usuario  = 'root';
 $senha    = 'secreta';
 $db       = 'db_exemplos';
 $sql      = 'SELECT * FROM tb_biblioteca ORDER BY nome ASC';
 $nrLinhas = 0;

 $conexao = mysqli_connect($host, $usuario, $senha, $db);

 $consulta mysqli_query($conexao, $sql);

 $nrLinhas = mysqli_num_rows($consulta);

 if($nrLinhas > 0)
 {
   $conteudoXML= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   $conteudoXML.= "<biblioteca>\n\t";
   while($registros = mysqli_fetch_array($consulta, MYSQLI_ASSOC))
   {
     $conteudoXML.= "<livro nome=\""$registros['nome'] . "\">\n\t\t";
     $conteudoXML.= "<descricao>\n\t\t\t\t";
     $conteudoXML.= $registros['descricao']."\n\t\t";
     $conteudoXML.= "</descricao>\n\t";
     $conteudoXML.= "</livro>\n";
   }
 
   $conteudoXML.= "</biblioteca>";
  
   $xml = new SimpleXMLElement($conteudoXML);

  $xml -> saveXML("diretorio/exemplo1.xml");
 }

mysqli_close($conexao):

NOTA: Este exemplo e bem parecido com o primeiro, a consulta é armazenada em uma string e depois usamos os métodos para criar o xml à partir dela.


# 3. AGORA VEREMOS A CRIAÇÃO SÓ COM MÉTODOS DA BIBLIOTECA SIMPLEXML (OO)

 $conexao = new mysqli($host, $usuario, $senha, $db);

 $consulta = $conexao -> query($sql);

 $nrLinhas = $consulta -> num_rows;

 if($nrLinhas > 0)
 {
   $xml"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   $xml.= "<biblioteca>\n</biblioteca>";

# NESTE MOMENTO CRIAMOS/INSTANCIAMOS O ARQUIVO NA MEMÓRIA
   $conteudoXML = new SimpleXMLElement($xml);
   while($registros = $consulta -> fetch_object())
   {
     # ADICIONAMOS O NÓ LIVRO AO CONTEÚDO DO ARQUIVO
     $noLivro = $conteudoXML -> addChild("livro");
     
# ADICIONAMOS O ATRIBUTO AO NÓ LIVRO
     $noLivro -> addAttribute("nome", utf8_encode($registros -> nome));
     
# ADICIONAMOS O NÓ DESCRICAO AO CONTAÚDO DO NÓ LIVRO
     $noLivro -> addChild("descricao"utf8_encode($registros -> descricao));
   }
 
   $conteudoXML -> saveXML("diretorio/exemplo2.xml");
 }

 $conexao -> close();

?>

Estes pequenos exemplos de criação de arquivos xml dão uma pequena mostra do quanto o PHP está preparado para lidar com novas tecnologias e arquivos.

A geração e leitura são muito importantes para portais que exigem inúmeras consultas ao Banco de Dados e têm um nº de acessos significativo. A técnica de databaseless pode ser utilizada através de leitura e geração de arquivos xml, diminuindo assim as requisições ao Banco de Dados.

A leitura também é muito útil para armazenar informações de fontes externas à sua aplicação PHP:
retornos bancários, retornos de órgãos governamentais, etc

No próximo post aprenderemos como o PHP lida ao ler estes tipos de arquivos. Até lá...

3 comentários:

  1. Boa Tarde, eu precisava fazer que código em vez de pegar apenas um arquivo especifico tipo suporte.xml
    ele pega-se as informações de um diretório especifico e me mostra-se em tela apenas as informações que
    eu peça. Você poderia me ajudar ? Desde já Obrigado!

    ResponderExcluir
    Respostas
    1. Bem, se você tem um diretório específico basta listar todos os arquivos contidos no mesmo e a cada arquivo desejado fazer um loop, mais ou menos assim:
      ";
      while($arquivo = $diretorio -> read())
      {
      //Aqui voce pode criar uma condição para o arquivo que deseja exibir o conteudo
      echo $arquivo;
      //Sendo o arquivo desejado faça um laço percorrendo seu conteúdo
      }
      $diretorio -> close();
      ?>

      Espero ter ajudado

      Excluir
  2. Olá, eu estou vendo que sempre é citado em varios sites que, " A técnica de databaseless pode ser utilizada através de leitura e geração de arquivos xml, diminuindo assim as requisições ao Banco de Dados.". Mas por exemplo, tenho vários colaboradores de um site, vou em cada link fornecido por eles e faço a leitura do xml, faço a atualização dos dados banco, mas no final das contas o cliente vai fazer a pesquisa com requisição ao BD, tem alguma forma de "cortar" este caminho? Pois pela leitura do xml já evitamos que os usuários façam a inserção.

    ResponderExcluir

Palavrões e comentários não agregadores de valores e conhecimentos serão descartados