+2

Simple XML - Lidando com XML no PHP5

criado por Anderson de Arruda Casimiro em 20/05/2005 9:58am
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 "&lt;core>&lt;title>mukeka&lt;/title>&lt;/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

Comentários:

Mostrando 1 - 10 de 17 comentários
Prezado Anderson:
O JavaScript abaixo não roda através do navegador Firefox. Será que VC poderia me ajudar alterando algum(s) parâmetros ? Agradeço desde já = Fiumari:
<script language="JavaScript"> var ultimo=-1, dBanner;
function carrega(x) {dBanner=x;Banners()}
function Banners()
{ var MNews = new Array();
MNews[0]= '<iframe " name="_blank" scrolling="no" src="http://www.finet.com.br/google.htm" width="100%" frameborder="0" target="_blank" height="350" BORDER="0"></iframe><a href="http://www.finet.com.br/google.htm" target="_blank"></a>';
MNews[1]= '<iframe " name="_blank" scrolling="no" src="http://www.finet.com.br/google2.htm" width="100%" frameborder="0" target="_blank" height="350" BORDER="0"></iframe><a href="http://www.finet.com.br/google2.htm" target="_blank"></a>'
while((Numero = parseInt(Math.random()*MNews.length))==ultimo);
dBanner.innerHTML=MNews[Numero];
setTimeout("Banners()",15000);
} </script>
03/09/2007 11:03am (~17 anos atrás)

Boa tarde ... tenho um XML para configuração de um sistema e gostaria de saber como sobrescrever as informaçoes neles... Exemplo <author>XXXX</author> trocar pelo <author>YYYY</author>.

Obrigado
02/05/2007 1:31pm (~17 anos atrás)

Saberia me indicar qual função devo utilizar no lugar dessa? Tenho um site hospedado na locaweb e eles me informaram que a versão é 5.0.

Obrigado
18/07/2006 4:36pm (~18 anos atrás)

Marcio, provavelmente a versão do PHP que estás usando é inferior à 5.0.0.
18/07/2006 4:14pm (~18 anos atrás)

Olá pessoal, tudo bom?

Porque estou com o seguinte erro?

Fatal error: Call to undefined function: simplexml_load_file() in /var/www/html/site/includes-site/classe_xml2.php on line 25
18/07/2006 2:26pm (~18 anos atrás)

na classe Xml, podemos aplicar a alteração descrita abaixo para que não hajam esses problemas. A função "array_map(função,array)" retorna um array com os elementos do array, após execução de uma função.

class Xml
{
.
.
.
function obj($search)
{
$obj = $this->data->xpath($search);
$aFinal = array_map(utf8_decode,get_object_vars($obj[0]));
return $aFinal;
}
}
15/07/2005 12:39pm (~19 anos atrás)

O simplexml sempre espera ler, e retorna resultados codificados em UTF-8. o que pode fazer é ao receber os dados do simplexml usar o utf8_decode()... na própria função que lê os dados do xml podemos tratar essas "aberrações".
12/07/2005 9:29am (~19 anos atrás)

Como eu faço se tiver acentos no meu arquivo xml!?
quando isso ocorre.. o texto volta zuado pra kramba.. alquem sabe o que pode ser?
obrigado
ivan
11/07/2005 9:59am (~19 anos atrás)

Jose Djalma disse:
copia e cola...
08/07/2005 8:21am (~19 anos atrás)

Seguinte, nao entendo nada de XML, e preciso pegar uma arquivo arquivo.xml, e jogar o conteúdo dele pra dentro de um arquivo arquivo.php, o XML é o seguite:
<?xml version="1.0" encoding="ISO-8859-1"?>
<CMA>
<QUOTES>
<PAPEL>ALGP BAR</PAPEL>
<DESCRICAO>Algodão Pluma Barreiras BA - R$/@</DESCRICAO>
<ULTIMO>37.37</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>ALGP UNA</PAPEL>
<DESCRICAO>Algodão Pluma Unai MG - R$/@</DESCRICAO>
<ULTIMO>40.67</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>ARRC CRI</PAPEL>
<DESCRICAO>Arroz Sequeiro Cristalina GO - R$/Sc 60kg</DESCRICAO>
<ULTIMO>21.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>ARRC RVE</PAPEL>
<DESCRICAO>Arroz Sequeiro Rio Verde GO - R$/Sc 60kg</DESCRICAO>
<ULTIMO>20.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>BOIG DOU</PAPEL>
<DESCRICAO>Boi Gordo Dourados MS - R$/@</DESCRICAO>
<ULTIMO>51.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>BOIG MGE</PAPEL>
<DESCRICAO>Boi Gordo Minas Gerais - R$/@</DESCRICAO>
<ULTIMO>51.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>CFDUR6 CER</PAPEL>
<DESCRICAO>Café Bica Dura T.6 Cerrado MG - R$/Sc 60kg</DESCRICAO>
<ULTIMO>265.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>CFCON7 COL</PAPEL>
<DESCRICAO>Café Conillon T.7 Colatina ES - R$/Sc 60kg</DESCRICAO>
<ULTIMO>153.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>FEIACE SPO</PAPEL>
<DESCRICAO>Feijão Carioca Extra Novo T.1 SP - R$/Sc 60kg</DESCRICAO>
<ULTIMO>123.50</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>FEIJC UNI</PAPEL>
<DESCRICAO>Feijão Carioca Unaí MG - R$/Sc 60kg</DESCRICAO>
<ULTIMO>85.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>MIL PATRO</PAPEL>
<DESCRICAO>Milho Patrocínio MG - R$/Sc 60kg</DESCRICAO>
<ULTIMO>16.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>MIL UNAI</PAPEL>
<DESCRICAO>Milho Unaí MG - R$/Sc 60kg</DESCRICAO>
<ULTIMO>15.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>SCARCOM MIG</PAPEL>
<DESCRICAO>Suino resfr. carcaça c. Atacado MG - R$/kg</DESCRICAO>
<ULTIMO>4.10</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>SUI MIG</PAPEL>
<DESCRICAO>Suino vivo Interior MG - R$/kg</DESCRICAO>
<ULTIMO>2.27</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>SOJ DOU</PAPEL>
<DESCRICAO>Soja Dourados MS (FOB) - R$/Sc 60kg</DESCRICAO>
<ULTIMO>27.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>SOJ UNA</PAPEL>
<DESCRICAO>Soja Unaí MG (FOB) - R$/Sc 60kg</DESCRICAO>
<ULTIMO>28.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>TRGPH MGA</PAPEL>
<DESCRICAO>Trigo Maringá PR (FOB) - R$/t</DESCRICAO>
<ULTIMO>370.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
<QUOTES>
<PAPEL>TRGPH SAN</PAPEL>
<DESCRICAO>Trigo Santo Angelo RS (FOB) - R$/t</DESCRICAO>
<ULTIMO>320.00</ULTIMO>
<DATA>04/07</DATA>
</QUOTES>
</CMA>

Como faço?
Grato a todos.
05/07/2005 6:09pm (~19 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)