Simple XML - Lidando com XML no PHP5
por Anderson de Arruda Casimiro

A extensão simpleXML pode ser adionada ao PHP4 e vem habilitada por default no PHP5. Tratar documentos XML com ela é algo relativamente simples. Mostrarei neste artigo um exemplo de como utilizar um arquivo XML para manter a configuração de um sistema, de uma maneira simples.



Bem, este é o arquivo que vamos utilizar... lógico que num ambiente web este arquivo deverá ficar num diretório protegido, mas seu script PHP deve ter acesso ao mesmo.

core.xml:

<?xml version="1.0"?>
<core>
  <sys>
    <name>Mukeka</name>
    <version>1.0</version>
    <author>Anderson de Arruda Casimiro</author>
    <email>anderson@duodraco.com</email>
    <fakeemail>anderson at duodraco dot com</fakeemail>
    <title>:: Mukeka Braba</title>
  </sys>
  <db>
    <type>mysql</type>
    <host>localhost</host>
    <user>quser</user>
    <password>quser</password>
    <database>mukeka</database>
  </db>
</core>


A função simplexml_load_file() tenta ler o arquivo passado no parâmetro. Se quiser passar uma string contendo o XML(algo como "<core><title>mukeka</title></core>") utilize a função simplexml_load_string(). Essas funções retornam um objeto(a tag pai do xml) com vários objetos encadeados(a tags filhas), que por sua vez possuem outros objetos encadeados(as filhas das filhas), e assim por diante.

Por exemplo, em nosso caso, para se pegar o valor de name, dentro de sys, dentro de core fazemos assim:


<?php
$obj 
simplexml_load_file("core.xml");
echo 
$obj->sys->name;
?>


Outra função bastante util é a xpath. Se quiséssemos acessar direto o objeto name poderíamos fazer assim:


<?php
$obj 
simplexml_load_file("core.xml");
$srch $obj->xpath("name");
echo 
$srch[0];
?>


Agora a página que efetivamente pegará o XML, o tratará e definirá as variáveis para o sistema:


<?php
class Core
{
    
private $system = array();
    
private $db = array();

    function 
__construct()
    {
        
$xml = new Xml("core.xml");
        
$this->system $xml->obj("sys");
        
$this->db $xml->obj("db");
    }

    
public function getSystem($index)
    {
        return 
$this->system[$index];
    }

    
public function getDb($index)
    {
        return 
$this->db[$index];
    }
}

class 
Xml
{
    
public $data;

    function 
__construct($file)
    {
        
$this->data simplexml_load_file($file) or die("Não é um arquivo válido");
    }

    function 
obj($search)
    {
        
$obj $this->data->xpath($search);
        return 
get_object_vars($obj[0]);
    }
}
?>


A Classe "Xml" somente possui um método construtor, o qual vai ler o arquivo XML e transformá-lo num objeto e definí-lo como atributo data. O método obj faz buscas usando o método xpath do simplexml. Como parâmetro você pode passar a string com o nome da tag a ser encontrada, o que pode retornar mais de um resultado, que será colocado em um array; você tambgém pode passar uma hierarquia, por exemplo: "/core/sys".

O retorno do método obj é um get_object_vars porque para nossa outra classe não precisaremos de objetos, mas sim seus valores; retorno o indice 0(zero) do resultado de $obj porque queremos o primeiro(e único) resultado da busca por "sys".
No construtor da classe Core, instanciamos Xml, e chamamos a busca ($xml->obj()) por "sys" e "db" que são as tags que vão fazer nossas definições. Esta classe ainda conta com os métodos getSystem() e getDb(), os quais irão retornar os valores propriamente ditos.

Lógico que seria muito mais fácil definir estes atributos direto no script, uma vez que este é muito simples. Agora imagine quão mais facil ficará para tratar outros documentos XML, e usá-los em outros sistemas, e até RSS, para o qual estou preparando uma coluna para breve, junto com as outras funcionalidades do simplexml.

Até breve.

PS.: Para maiores esclarecimentos: http://www.php.net/simplexml