W3docs

PHP SimpleXML - simplexml_load_file e simplexml_load_string

A extensão SimpleXML do PHP facilita a análise e manipulação de dados XML. Conheça as funções simplexml_load_file e simplexml_load_string.

Como Obter e Ler XML com PHP SimpleXML

A extensão SimpleXML do PHP é a forma mais rápida de ler e editar documentos XML. Em vez de percorrer manualmente uma árvore de nós, o SimpleXML converte o documento inteiro em um objeto PHP comum, cujos elementos são acessados com a sintaxe familiar de propriedades e arrays — $xml->title, $xml->item[0], $xml['id'].

Este capítulo aborda as duas funções usadas para carregar XML — simplexml_load_file() (para um arquivo ou URL) e simplexml_load_string() (para XML já armazenado como string) — e também como ler elementos, ler atributos, percorrer nós repetidos, adicionar novos dados e serializar o resultado de volta para XML.

O SimpleXML é fornecido com a distribuição padrão do PHP e está habilitado por padrão, portanto geralmente não há nada a instalar.

Quando usar SimpleXML (e quando não usar)

  • Use SimpleXML para leitura e edição leve de XML bem formado: arquivos de configuração, feeds RSS/Atom, respostas simples de API, sitemaps.
  • Recorra ao DOMDocument quando precisar de controle refinado: inserir nós em uma posição específica, trabalhar com comentários ou validação de esquema.
  • Use o XML Parser (Expat) para documentos muito grandes que você deseja transmitir evento a evento sem carregar tudo na memória.

Carregando dados XML

O primeiro passo é obter o XML em um objeto SimpleXML. Há dois pontos de entrada, e qual você escolhe depende apenas de onde seu XML está atualmente.

Carregando um arquivo XML com simplexml_load_file()

simplexml_load_file() lê XML de um caminho local ou de uma URL e retorna um SimpleXMLElement. Em caso de erro de análise, retorna false e emite um aviso.

<?php

// books.xml on disk, or "https://example.com/feed.xml"
$xml = simplexml_load_file('books.xml');

if ($xml === false) {
    echo "Failed to load XML.";
} else {
    echo $xml->book[0]->title; // first <title>
}

Carregando uma string XML com simplexml_load_string()

Quando o XML já está em uma variável — por exemplo, o corpo de uma resposta HTTP — use simplexml_load_string() em vez disso.

php— editable, runs on the server

Ambas as funções retornam o elemento raiz do documento, não um wrapper ao redor dele. Portanto, no exemplo acima, $xml é <root>, e $xml->child é o nó <child> dentro dele.

Dica: um SimpleXMLElement possui um valor semelhante a string, mas ainda é um objeto. Envolva-o com (string) (ou concatene-o) sempre que precisar de uma string PHP simples — por exemplo $title = (string) $xml->book[0]->title;. Consulte converter SimpleXML para string para mais detalhes.

Acessando dados XML

Uma vez carregado, você lê o documento com sintaxe de objeto e array.

Acessando elementos

Elementos filhos são propriedades do objeto. Quando uma tag se repete, indexe-a como um array; [0] é a primeira ocorrência.

<?php

$data = <<<XML
<library>
  <book><title>PHP Basics</title></book>
  <book><title>Advanced XML</title></book>
</library>
XML;

$xml = simplexml_load_string($data);

echo $xml->book[0]->title, "\n"; // PHP Basics
echo $xml->book[1]->title, "\n"; // Advanced XML

Percorrendo elementos repetidos

Como tags repetidas se comportam como uma lista iterável, foreach é a forma natural de lê-las todas:

<?php

$data = <<<XML
<library>
  <book><title>PHP Basics</title></book>
  <book><title>Advanced XML</title></book>
</library>
XML;

$xml = simplexml_load_string($data);

foreach ($xml->book as $book) {
    echo $book->title, "\n";
}
// PHP Basics
// Advanced XML

Acessando atributos

Os atributos são acessados com sintaxe de array no elemento que os contém:

<?php

$xml = simplexml_load_string('<book id="42" lang="en"><title>PHP</title></book>');

echo $xml['id'], "\n";    // 42
echo $xml['lang'], "\n";  // en

Modificando dados XML

O SimpleXML também pode criar e editar documentos no lugar.

Adicionando elementos

addChild() adiciona um novo elemento e retorna o elemento criado, para que você possa continuar encadeando:

<?php

$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');

echo $xml->child; // Value

Adicionando atributos

addAttribute() adiciona um atributo ao elemento no qual você o chama:

<?php

$xml = simplexml_load_string('<root><child>Value</child></root>');
$xml->child->addAttribute('attribute', 'on');

echo $xml->child['attribute']; // on

Convertendo SimpleXML de volta para XML

asXML() serializa o objeto de volta para uma string XML (sem argumento) ou grava diretamente em um arquivo (quando você passa um caminho). É assim que você persiste as alterações feitas acima. Consulte o método asXML para mais informações.

<?php

$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');

echo $xml->asXML();
// <?xml version="1.0"?>
// <root><child>Value</child></root>

Tratando XML malformado

Em caso de falha, essas funções retornam false e disparam um aviso, o que é difícil de tratar. Transforme os avisos em erros coletáveis com libxml_use_internal_errors():

<?php

libxml_use_internal_errors(true);

$xml = simplexml_load_string('<root><child></root>'); // missing </child>

if ($xml === false) {
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message), "\n";
    }
    libxml_clear_errors();
}

Conclusão

O SimpleXML é o caminho mais rápido de um arquivo ou string XML para dados PHP legíveis. Carregue com simplexml_load_file() ou simplexml_load_string(), leia elementos e atributos com sintaxe de propriedades e arrays, percorra nós repetidos com foreach, edite com addChild() e addAttribute(), e serialize de volta com asXML(). Para processamento mais avançado, avance para o DOMDocument; para transmitir arquivos enormes, use o XML Parser.

Practice

Prática
Qual método a extensão PHP SimpleXML usa para analisar o arquivo XML?
Qual método a extensão PHP SimpleXML usa para analisar o arquivo XML?
Was this page helpful?