Simple XML - Lidando com XML no PHP5
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:
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:
Outra função bastante util é a xpath. Se quiséssemos acessar direto o objeto name poderíamos fazer assim:
Agora a página que efetivamente pegará o XML, o tratará e definirá as variáveis para o sistema:
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
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
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
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
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
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;
}
}
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
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)
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.
<?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)
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>