simplexml_load_file()
SimpleXML es una extensión de PHP que proporciona una API sencilla para trabajar con documentos XML. Aprende a usar simplexml_load_file().
Introducción
simplexml_load_file() lee un archivo XML del disco (o una URL) y convierte su contenido en un objeto SimpleXMLElement que puedes navegar con la sintaxis habitual de propiedades y arrays de PHP. Es el punto de entrada basado en archivos de la extensión SimpleXML — la forma más sencilla de convertir un documento XML en algo sobre lo que puedas iterar y leer.
Úsala siempre que tengas un archivo XML — un archivo de configuración, un feed RSS/Atom, una respuesta de API guardada en disco, o un sitemap — y quieras extraer valores sin escribir un analizador a mano. Si tu XML está en una cadena en lugar de un archivo, usa su función hermana simplexml_load_string().
Este capítulo cubre la firma de la función, un ejemplo completo y funcional (incluido el XML que lee), cómo acceder a atributos y espacios de nombres, y cómo gestionar los errores de carga de forma limpia.
Sintaxis
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 | Descripción |
|---|---|
$filename | Ruta o URL del archivo XML a cargar. |
$class_name | Clase a instanciar. Debe extender SimpleXMLElement; por defecto es SimpleXMLElement. |
$options | Máscara de bits de constantes de opciones libxml como LIBXML_NOCDATA o LIBXML_NOBLANKS. |
$namespace_or_prefix | Prefijo de espacio de nombres o URI para restringir el árbol devuelto. |
$is_prefix | true si el argumento anterior es un prefijo, false si es un URI. |
Valor de retorno: un SimpleXMLElement en caso de éxito, o false si el archivo no se puede leer o contiene XML malformado.
Un ejemplo completo
Supón que hay un archivo llamado books.xml junto a tu 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>Cárgalo, confirma que se analizó correctamente e itera sobre los 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";
}Salida:
The PHP Way by Jane Doe
XML in Practice by John SmithObserva la comparación estricta === false. Los objetos SimpleXML son "verdaderos", por lo que una comprobación con if (!$xml) puede fallar en casos límite — compara siempre explícitamente contra false.
Lectura de atributos
SimpleXML expone los elementos hijo como propiedades del objeto ($book->title) y los atributos XML mediante acceso de tipo array ($book['id']). Como los valores son objetos SimpleXMLElement en lugar de cadenas simples, conviértelos con (string) antes de usarlos en cálculos o comparaciones:
<?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";
}Salida:
b1: The PHP Way — 29.99 USD
b2: XML in Practice — 24.50 EURTrabajo con espacios de nombres
Cuando un documento declara espacios de nombres XML, el acceso mediante propiedades simples solo alcanza el espacio de nombres predeterminado. Usa ->children($namespaceUri) para descender a una rama con espacio de nombres y ->attributes($namespaceUri) para leer atributos con espacio de nombres:
<?php
// Access elements in the Atom namespace.
$atom = $xml->children('http://www.w3.org/2005/Atom');
echo $atom->title;Para profundizar en espacios de nombres y recorridos, consulta SimpleXML en PHP.
Manejo de errores de carga de forma limpia
Por defecto, el XML malformado emite advertencias de PHP. Para suprimirlas e inspeccionar los errores tú mismo, activa el manejo interno de errores con libxml_use_internal_errors() antes de cargar:
<?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();
}Salida:
Could not load the file:
failed to load external entity "missing.xml"Este patrón mantiene la salida limpia y te da acceso estructurado a cada error de análisis mediante libxml_get_errors().
Errores comunes
falsevs. advertencia. Un archivo inexistente o un error de sintaxis devuelvefalsey genera una advertencia, a menos que actives los errores internos. Comprueba siempre el valor de retorno.- Convierte antes de comparar.
$book->price == 29.99funciona por coincidencia;(float) $book->price === 29.99es lo que realmente quieres. - Lectura de archivos remotos.
$filenamepuede ser una URL, pero eso requiere queallow_url_fopenesté habilitado enphp.ini. - Escritura de vuelta. SimpleXML es excelente para leer. Para serializar un elemento a una cadena XML, llama a
asXML().
Conclusión
simplexml_load_file() es la forma más rápida de cargar un archivo XML en un árbol de objetos navegable en PHP. Combínala con comprobaciones estrictas === false, conversiones (string) al leer valores, y manejo de errores con libxml, y tendrás una base sólida para consumir feeds, configuraciones y APIs XML. Para entrada en cadena usa simplexml_load_string(), y para técnicas de recorrido completo continúa con SimpleXML en PHP.