SimpleXML fornece um conjunto de ferramentas, que torna as tarefas de carregar, ler e alterar documentos XML, muito simples e fácil. A extensão SimpleXML requer PHP 5 ou superior e é habilitada por padrão. Para desativar a extensão, utilize --disable-simplexml nas opções de configuração.
Nesse primeiro exemplo, criaremos um document XML e lê-lo utilizando simplexml_load_file() que converte um arquivo XML em um objeto.
O valor de retorno de simplexml_load_file() é um objeto da classe SimpleXMLElement que representa os elementos do documento XML. Quando houver erro, irá retornar FALSE. Uma frequente causa de erro é a incorreta formatação do documento XML. Vamos agora criar nosso documento XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<regiao>
<sudeste>
<descricao>Sudeste possui 4 estados: Rio de Janeiro, Sao Paulo, Espirito Santo e Minas Gerais</descricao>
<estados>
<estado>
<nome>Rio de Janeiro</nome>
<capital>Rio de Janeiro</capital>
</estado>
<estado>
<nome>Sao Paulo</nome>
<capital>Sao Paulo</capital>
</estado>
<estado>
<nome>Minas Gerais</nome>
<capital>Belo Horizonte</capital>
</estado>
<estado>
<nome>Espirito Santo</nome>
<capital>Vitoria</capital>
</estado>
</estados>
<times-regiao>
<times>Flamengo, Botafogo, Fluminense, Vasco, Sao Paulo, Corinthians, Palmeiras e Santos</times>
</times-regiao>
<quant_times type="numero">8</quant_times>
<quant_times type="jogadores">11</quant_times>
</sudeste>
</regiao>
Vamos ler o documento XML acima e verificar se não houve erros:
//Lê o documento XML
//Uma frequente causa de erros, é a incorreta formatação do documento XML
if( file_exists('exemplo1.xml') ) {
$xml = simplexml_load_file
('exemplo1.xml');
//Vamos exibir as informações do objeto, utilizando var_dump que retorna uma representação estruturada, incluindo tipo e valor
var_dump($xml);
}
Podemos também ver os nós filhos de um determinado nó, utilizando children(). Abaixo, exemplo dos filhos do nó <sudeste> do documento XML:
foreach( $xml->
sudeste->
children() as $elemento =>
$valor ) {
echo "<br />$elemento -> $valor";
}
Utilizaremos agora as propriedades do objeto simpleXMLElement, para ler o documento XML. No próximo exemplo, pegamos a descrição dos estados da região sudeste, string entre as tags <descricao> e </descricao> do documento XML:
echo "<p>Descrição dos estados: " .
$xml->
sudeste->
descricao .
"<p>";
Para acessar os times da região sudeste, elemento <times> que está dentro de <times-regiao> do documento XML, que contêm caracter não permitido como o hífen pela convenção de nomes do PHP, encapsulamos o elemento <times-regiao> com chaves e apóstrofos.
echo $xml->
sudeste->
{"times-regiao"}->
times;
Aqui, pegamos o atributo como elemento de índice (type) para que possamos verificar quantos times há e número de jogadores.
foreach ($xml->
sudeste->
quant_times as $quant_times) {
switch((string
) $quant_times["type"]) {
case "numero":
echo "<p>".
$quant_times,
" times.";
break;
case "jogadores":
echo "<br />".
$quant_times,
" jogadores em cada time";
break;
}
}
Agora modificaremos nosso documento XML, fazendo algumas alterações e adicionando nós. Primeiramente, alterando o nome das capitais dos estados de São Paulo e Espirito Santo:
$xml->sudeste->estados->estado[1]->capital = "Campinas";
$xml->sudeste->estados->estado[3]->capital = "Guarapari";
Para adicionar um elemento filho a um nó XML, usamos addChild(). O exemplo abaixo, adiciona o elemento <descricao> dentro do nó <sul> ao documento XML:
$sul = $xml->addChild("sul");
$sul->addChild("descricao","Regiao Sul possui varios times: Gremio, Internacional, Avai, Parana, Atletico-PR, Figueirense...");
Para verificar as alterações, vamos exibir o documento XML com asXML(), que retorna uma string XML. Perceba que as capitais do Espirito Santo e de São Paulo mudaram e que houve a inclusão de nós.
Se você desejar que as alterações realizadas até agora, sejam gravadas no arquivo, utilizamos file_put_contents. Muito cuidado ao utilizar file_put_contents, pois o conteúdo original será sobrescrito.
file_put_contents("exemplo1.xml",$xml->asXML());
Para download dos scripts utilizados nesta matéria:
xml_com_simpleXml.zip
Espero que essa matéria tenha ajudado você a conhecer um pouco mais da extensão SimpleXML. Em breve, colocarei mais matérias abordando outros assuntos interessantes.
Até a próxima!
Rogério Almeida