Forum und email

SimpleXML

Introdução

O SimpleXML provê um conjunto de ferramentas muito fácil e simples de usar para converter XML em objetos que podem ser processados normalmente com seletores de propriedades e iteradores de arrays.

Dependências

A extensão SimpleXML requer PHP 5.

Instalação

A extensão SimpleXML é habilitada por padrão. Para desabilita-la, utilize --disable-simplexml nas opções de configuração.

Exemplos

Muitos exemplos vistos aqui requerem uma string XML. Ao invés de ficar repetindo esta string em cada exemplo, vamos colocá-la em um arquivo que iremos incluir em cada exemplo. Este arquivo é mostrado no exemplo a seguir. Porém, você pode criar um document XML e lê-lo utilizando simplexml_load_file().

Example#1 Arquivo examplp.php com uma string XML

<?php
$xmlstr 
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Actor</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>
XML;
?>

A simplicidade do SimpleXML aparece mais claramente quando extraímos uma string ou um número de um documento XML básico.

Example#2 Otendo <plot>

<?php
include 'examplo.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie[0]->plot// "So this language. It's like..."
?>

A tarefa de acessar elementos de dentro de um documento XML que contêm caractéres não permitidos pela a convenção de nomes do PHP (por exemplo, o hífen) pode ser feita encapsulando o elemento com chaves e apóstrofos.

Example#3 Obtendo <line>

<?php
include 'examplo.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie->{'great-lines'}->line// "PHP solves all my web problems"
?>

Example#4 Acessando elementos não-únicos no SimpleXML

Caso existam nós filhos com nomes iguais dentro de um mesmo nó pai, aplica-se a iteração normal.

<?php
include 'examplo.php';

$xml = new SimpleXMLElement($xmlstr);

/* Para cada nó <movie>, nós imprimimos um <plot> diferente. */
foreach ($xml->movie as $movie) {
   echo 
$movie->plot'<br />';
}

?>

Example#5 Utilizando atributos

Até agora, só cobrimos o trabalho de ler o nome dos elementos e os seus valores. SimpleXML pode também acessar o atributo dos elementos. Acessar os atributos de um elemento é tão simples quando acessar os atributos de uma array.

<?php
include 'examplo.php';

$xml = new SimpleXMLElement($xmlstr);

/* Acessa os nós <rating> do primeiro filme.
 * Mostra a escala do Rating também. */
foreach ($xml->movie[0]->rating as $rating) {
    switch((string) 
$rating['type']) { // Get attributes as element indices
    
case 'thumbs':
        echo 
$rating' thumbs up';
        break;
    case 
'stars':
        echo 
$rating' stars';
        break;
    }
}
?>

Example#6 Comparando elementos e atributos com texto

Para comparar um elemento ou atributo com uma string ou passar para uma função que requer uma string, você deve converter para uma string utilizando (string). De outra forma, o PHP irá tratar este elemento como um objeto.

<?php     
include 'examplo.php';

$xml = new SimpleXMLElement($xmlstr);

if ((string) 
$xml->movie->title == 'PHP: Behind the Parser') {
    print 
'My favorite movie.';
}

htmlentities((string) $xml->movie->title);
?>

Example#7 Utilizando XPath

SimpleXML possui suporte a XPath embutido. Para encontrar todos os elementos <character>:

<?php
include 'examplo.php';
$xml = new SimpleXMLElement($xmlstr);

foreach (
$xml->xpath('//character') as $character) {
    echo 
$character->name'played by '$character->actor'<br />';
}
?>

'//' serve como uma wildcard. Para especificar um caminho absoluto, basta omitir uma das barras.

Example#8 Atribuindo valores

Dados no SimpleXML não precisam ser constantes, necesseariamente. O objeto permite a manipulação de todos os seus elementos.

<?php
include 'examplo.php';
$xml = new SimpleXMLElement($xmlstr);

$xml->movie[0]->characters->character[0]->name 'Miss Coder';

echo 
$xml->asXML();
?>

O código acima irá mostrar um novo documento XML, como o original, exceto que o novo irá trocar Ms. Coder por Miss Coder.

Example#9 Adicionando elementos e atributos

Desde o PHP 5.1.3, SimpleXML possui a habilidade de adicionar atributos e nós filhos facilmente.

<?php
include 'examplo.php';
$xml = new SimpleXMLElement($xmlstr);

$character $xml->movie[0]->characters->addChild('character');
$character->addChild('name''Mr. Parser');
$character->addChild('actor''John Doe');

$rating $xml->movie[0]->addChild('rating''PG');
$rating->addAttribute('type''mpaa');

echo 
$xml->asXML();
?>

O código acima irá mostrar um documento XML baseado no original, mas contendo um novo personagem e um novo rating.

Example#10 Interoperabilidade DOM

PHP possui um mecanismo para converter nós XML entre os formatos SimpleXML e DOM. Este exemplo mostra como mudar um elemento DOM para SimpleXML.

<?php
$dom 
= new domDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!
$dom) {
     echo 
'Erro ao interpretar o documento';
     exit;
}

$s simplexml_import_dom($dom);

echo 
$s->book[0]->title;
?>

Índice