simplexml_load_file()
SimpleXML é uma extensão PHP que fornece uma API simples para trabalhar com documentos XML. Saiba como usar simplexml_load_file().
Introdução
simplexml_load_file() lê um arquivo XML do disco (ou de uma URL) e converte seu conteúdo em um objeto SimpleXMLElement que pode ser navegado com propriedades e sintaxe de array comuns do PHP. É o ponto de entrada baseado em arquivo da extensão SimpleXML — a maneira mais simples de transformar um documento XML em algo que você pode percorrer e ler.
Use esta função sempre que tiver um arquivo XML — um arquivo de configuração, um feed RSS/Atom, uma resposta de API salva em disco ou um sitemap — e quiser extrair valores sem precisar escrever um parser manualmente. Se o seu XML estiver em uma string em vez de um arquivo, use a função irmã simplexml_load_string().
Este capítulo cobre a assinatura da função, um exemplo completo e funcional (incluindo o XML que ele lê), como acessar atributos e namespaces, e como lidar com falhas de carregamento de forma elegante.
Sintaxe
simplexml_load_file(
string $filename,
?string $class_name = SimpleXMLElement::class,
int $options = 0,
string $namespace_or_prefix = "",
bool $is_prefix = false
): SimpleXMLElement|false| Parâmetro | Descrição |
|---|---|
$filename | Caminho ou URL do arquivo XML a ser carregado. |
$class_name | Classe a ser instanciada. Deve estender SimpleXMLElement; o padrão é o próprio SimpleXMLElement. |
$options | Bitmask de constantes de opção libxml como LIBXML_NOCDATA ou LIBXML_NOBLANKS. |
$namespace_or_prefix | Prefixo de namespace ou URI para restringir a árvore retornada. |
$is_prefix | true se o argumento anterior for um prefixo, false se for uma URI. |
Valor de retorno: um SimpleXMLElement em caso de sucesso, ou false se o arquivo não puder ser lido ou contiver XML malformado.
Um exemplo completo
Suponha que um arquivo chamado books.xml esteja na mesma pasta que seu script:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="b1">
<title>The PHP Way</title>
<author>Jane Doe</author>
<price currency="USD">29.99</price>
</book>
<book id="b2">
<title>XML in Practice</title>
<author>John Smith</author>
<price currency="EUR">24.50</price>
</book>
</library>Carregue o arquivo, confirme que foi analisado e itere sobre os elementos <book>:
<?php
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML file.\n";
exit(1);
}
foreach ($xml->book as $book) {
echo $book->title . " by " . $book->author . "\n";
}Saída:
The PHP Way by Jane Doe
XML in Practice by John SmithObserve a comparação estrita com === false. Objetos SimpleXML são "truthy", portanto uma verificação com if (!$xml) pode se comportar de forma inesperada em casos extremos — sempre compare explicitamente com false.
Lendo atributos
O SimpleXML expõe elementos filhos como propriedades de objeto ($book->title) e atributos XML por meio de acesso estilo array ($book['id']). Como os valores são objetos SimpleXMLElement em vez de strings simples, converta-os com (string) antes de usá-los em cálculos ou comparações:
<?php
$xml = simplexml_load_file('books.xml');
foreach ($xml->book as $book) {
$id = (string) $book['id'];
$currency = (string) $book->price['currency'];
echo "{$id}: {$book->title} — {$book->price} {$currency}\n";
}Saída:
b1: The PHP Way — 29.99 USD
b2: XML in Practice — 24.50 EURTrabalhando com namespaces
Quando um documento declara namespaces XML, o acesso simples por propriedade alcança apenas o namespace padrão. Use ->children($namespaceUri) para acessar um ramo com namespace e ->attributes($namespaceUri) para ler atributos com namespace:
<?php
// Access elements in the Atom namespace.
$atom = $xml->children('http://www.w3.org/2005/Atom');
echo $atom->title;Para uma visão mais aprofundada sobre namespaces e travessia, consulte SimpleXML no PHP.
Lidando com falhas de carregamento de forma elegante
Por padrão, XML malformado emite avisos do PHP. Para suprimi-los e inspecionar os erros você mesmo, ative o tratamento interno de erros com libxml_use_internal_errors() antes de carregar:
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_file('missing.xml');
if ($xml === false) {
echo "Could not load the file:\n";
foreach (libxml_get_errors() as $error) {
echo " " . trim($error->message) . "\n";
}
libxml_clear_errors();
}Saída:
Could not load the file:
failed to load external entity "missing.xml"Esse padrão mantém sua saída limpa e fornece acesso estruturado a cada erro de análise por meio de libxml_get_errors().
Armadilhas comuns
falsevs. aviso. Um arquivo ausente ou um erro de sintaxe retornafalsee emite um aviso, a menos que você ative os erros internos. Sempre verifique o valor de retorno.- Converter antes de comparar.
$book->price == 29.99funciona por coincidência;(float) $book->price === 29.99é o que você realmente quer. - Lendo arquivos remotos.
$filenamepode ser uma URL, mas isso requer queallow_url_fopenesteja habilitado nophp.ini. - Escrevendo de volta. SimpleXML é ótimo para leitura. Para serializar um elemento de volta para uma string XML, chame
asXML().
Conclusão
simplexml_load_file() é a maneira mais rápida de carregar um arquivo XML em uma árvore de objetos navegável no PHP. Combine-a com verificações estritas de === false, conversões com (string) ao ler valores e tratamento de erros com libxml, e você terá uma base robusta para consumir feeds, configurações e APIs XML. Para entrada em string, use simplexml_load_string(), e para técnicas completas de travessia, continue com SimpleXML no PHP.