Uso Básico de SimpleXML
Muitos exemplos nesta referência requerem uma string XML. Em vez de repetir esta string em todos os exemplos, ela foi colocada em um arquivo que incluímos em cada exemplo. Este arquivo incluído é mostrado na seção de exemplo a seguir. Alternativamente, um documento XML pode ser criado e lido com simplexml_load_file().
Example #1 Inclusão do arquivo exemplo.php com string XML
<?php
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<filmes>
<filme>
<titulo>PHP: Nos Bastidores do Interpretador</titulo>
<personagens>
<personagem>
<nome>Srta. Codificadora</nome>
<ator>Onlivia Actora</ator>
</personagem>
<personagem>
<nome>Sr. Codificador</nome>
<ator>El Actór</ator>
</personagem>
</personagens>
<resumo>
Então, essa linguagem. Se parece com uma linguagem de programação. Ou seria uma
liguagem de scripts? Tudo é revelado nesta emocionante paródia de terror
de um documentário.
</resumo>
<melhores-frases>
<frase>O PHP resolve todos os meus problemas!</frase>
</melhores-frases>
<classificacao tipo="gostei">7</classificacao>
<classificacao tipo="estrelas">5</classificacao>
</filme>
</filmes>
XML;
?>
A simplicidade do SimpleXML aparece mais claramente quando se extrai uma string ou número de um documento XML básico.
Example #2 Obtendo o <resumo>
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
echo $filmes->filme[0]->resumo;
?>
O exemplo acima produzirá:
Então, essa linguagem. Se parece com uma linguagem de programação. Ou seria uma liguagem de scripts? Tudo é revelado nesta emocionante paródia de terror de um documentário.
O acesso a elementos em um documento XML que contém caracteres não permitidos pela convenção de nomenclatura do PHP (por exemplo, o hífen) pode ser realizado encapsulando o nome do elemento entre chaves e apóstrofo.
Example #3 Obtendo <frase>
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
echo $filmes->filme->{'melhores-frases'}->frase;
?>
O exemplo acima produzirá:
O PHP resolve todos os meus problemas!
Example #4 Acessando elementos não exclusivos em SimpleXML
Quando existem múltiplas instâncias de um elemento como filhos de um único elemento pai, aplicam-se técnicas normais de iteração.
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
/* Para cada nó <personagem>, é mostrado um <nome> separado. */
foreach ($filmes->filme->personagens->personagem as $personagem) {
echo $personagem->nome, ' representado(a) por ', $personagem->ator, PHP_EOL;
}
?>
O exemplo acima produzirá:
Srta. Codificadora representado(a) por Onlivia Actora Sr. Codificador representado(a) por El Actór
Note:
Propriedades (
$filmes->filme
no exemplo anterior) não são arrays. Elas são objetos iteráveis e acessíveis.
Example #5 Usando atributos
Até agora, foi coberto apenas o trabalho de leitura dos nomes dos elementos e seus valores. SimpleXML também pode acessar atributos de elementos. Os atributos de um elemento são acessados da mesma forma que os elementos de um array.
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
/* Acessando os nós <classificacao> do primeiro filme.
* Mostra o valor da classificação também. */
foreach ($filmes->filme[0]->classificacao as $classificacao) {
switch((string) $classificacao['tipo']) { // Obtém atributos como índices de elementos
case 'gostei':
echo $classificacao, ' gostaram, ';
break;
case 'estrelas':
echo $classificacao, ' estrelas';
break;
}
}
?>
O exemplo acima produzirá:
7 gostaram, 5 estrelas
Example #6 Comparando Elementos e Atributos com Texto
Para comparar um elemento ou atributo com uma string ou passá-lo para uma
função que requer uma string, ele deve ser convertido em uma string usando
(string)
. Caso contrário, o PHP trata o elemento como um objeto.
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
if ((string) $filmes->filme->titulo == 'PHP: Nos Bastidores do Interpretador') {
print 'Meu filme favorito. ';
}
echo htmlentities((string) $filmes->filme->titulo);
?>
O exemplo acima produzirá:
Meu filme favorito. PHP: Nos Bastidores do Interpretador
Example #7 Comparando Dois Elementos
Dois SimpleXMLElements são considerados diferentes mesmo que apontem para o mesmo elemento.
<?php
include 'exemplo.php';
$filmes1 = new SimpleXMLElement($xmlstr);
$filmes2 = new SimpleXMLElement($xmlstr);
var_dump($filmes1 == $filmes2);
?>
O exemplo acima produzirá:
bool(false)
Example #8 Usando XPath
SimpleXML inclui suporte interno a XPath.
Para encontrar todos os elementos <personagem>
:
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
foreach ($filmes->xpath('//personagem') as $personagem) {
echo $personagem->nome, ' representado(a) por ', $personagem->ator, PHP_EOL;
}
?>
'//
' serve como um coringa. Para especificar caminhos
absolutos, basta omitir uma das barras.
O exemplo acima produzirá:
Srta. Codificadora representado(a) por Onlivia Actora Sr. Codificador representado(a) por El Actór
Example #9 Definindo valores
Os dados no SimpleXML não precisam ser constantes. O objeto permite a manipulação de todos os seus elementos.
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
$filmes->filme[0]->personagens->personagem[0]->nome = 'Senhorita Codificadora';
echo $filmes->asXML();
?>
O exemplo acima produzirá:
<?xml version="1.0" standalone="yes"?> <filmes> <filme> <titulo>PHP: Nos Bastidores do Interpretador</titulo> <personagens> <personagem> <nome>Senhorita Codificadora</nome> <ator>Onlivia Actora</ator> </personagem> <personagem> <nome>Sr. Codificador</nome> <ator>El Actór</ator> </personagem> </personagens> <resumo> Então, essa linguagem. Se parece com uma linguagem de programação. Ou seria uma liguagem de scripts? Tudo é revelado nesta emocionante paródia de terror de um documentário. </resumo> <melhores-frases> <frase>O PHP resolve todos os meus problemas!</frase> </melhores-frases> <classificacao tipo="gostei">7</classificacao> <classificacao tipo="estrelas">5</classificacao> </filme> </filmes>
Example #10 Adicionando elementos e atributos
SimpleXML tem a capacidade de adicionar facilmente filhos e atributos.
<?php
include 'exemplo.php';
$filmes = new SimpleXMLElement($xmlstr);
$personagem = $filmes->filme[0]->personagens->addChild('personagem');
$personagem->addChild('nome', 'Sr. Interpretador');
$personagem->addChild('ator', 'Fulano de Tal');
$classificacao = $filmes->filme[0]->addChild('classificacao', 'PG');
$classificacao->addAttribute('tipo', 'mpaa');
echo $filmes->asXML();
?>
O exemplo acima produzirá:
<?xml version="1.0" standalone="yes"?> <filmes> <filme> <titulo>PHP: Nos Bastidores do Interpretador</titulo> <personagens> <personagem> <nome>Srta. Codificadora</nome> <ator>Onlivia Actora</ator> </personagem> <personagem> <nome>Sr. Codificador</nome> <actor>El Actór</actor> </personagem> <personagem><nome>Sr. Interpretador</nome><ator>Fulano de Tal</ator></personagem></personagens> <resumo> Então, essa linguagem. Se parece com uma linguagem de programação. Ou seria uma liguagem de scripts? Tudo é revelado nesta emocionante paródia de terror de um documentário. </resumo> <melhores-frases> <frase>O PHP resolve todos os meus problemas!</frase> </melhores-frases> <classificacao tipo="gostei">7</classificacao> <classificacao tipo="estrelas">5</classificacao> <classificacao tipo="mpaa">PG</classificacao></filme> </filmes>
Example #11 Interoperabilidade com o DOM
PHP possui um mecanismo para converter nós XML entre os formatos SimpleXML e DOM. Este exemplo mostra como um elemento DOM pode ser alterado para SimpleXML.
<?php
$dom = new DOMDocument;
$dom->loadXML('<livros><livro><titulo>Blá</titulo></livro></livros>');
if (!$dom) {
echo 'Erro ao interpretar o documento.';
exit;
}
$livros = simplexml_import_dom($dom);
echo $livros->livro[0]->titulo;
?>
O exemplo acima produzirá:
Blá