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