Gracias por visitar www.lewebmonster.com :) Los artículos publicados en este blog son completamente originales. La mayoría de los mismos contienen ejemplos o archivos que pueden descargarse para mayor comodidad del visitante (usted); el único requisito para realizar descargas es estar registrado (el registro es completamente gratis y no se le va a enviar ningún tipo de publicidad a su correo electrónico). Si desea colaborar con el crecimiento de este blog, por favor, de un Like en la parte superior derecha de esta página. Gracias!

VN:F [1.9.22_1171]
Rating: 4.8/5 (5 votes cast)

XML o eXtensible Markup Language es un lenguaje muy utilizado para intercambiar datos entre aplicaciones, y en realidad, sirve para intercambiar casi cualquier cosa que se nos ocurra. La sintáxis de XML es similar a la de HTML y no es nada del otro mundo. Podemos usar XML en la web y en cualquier otro tipo de aplicación. Muchos lenguajes de programación ya tienen funciones integradas para interpretar y generar XML, cosa que nos facilita la vida. Además, para aquellos lenguajes que aún no cuentan con funciones nativas para hacerlo existen librerías gratis que solucionan esta carencia.

En estos días he venido trabajando en un proyecto que se conecta a una serie de web services creados con PHP5 que devuelven la información en formato XML, y entonces se me ocurrió escribir este artículo ;) Vamos a ver cómo leer un archivo XML con PHP, usando la extensión SimpleXML.

Leer un archivo XML con PHP y SimpleXML

Para leer un archivo XML con la extensión SimpleXML y PHP, usamos la función simplexml_load_file(). Lo que hace esta función es interpretar un archivo XML y convertirlo en un objeto, para luego manipularlo fácilmente. La función simplexml_load_file() admite varios parámetros, pero en los ejemplos de acá solo vamos a utilizar el primero, que es requerido, y es la ruta completa del archivo que vamos a manipular.

Por cierto, toda la documentación de SimpleXML la pueden encontrar en el sitio oficial de PHP. Para ver la lista completa de parámetros admitidos por simplexml_load_file() haga clic en este enlace.

Ejemplo para leer un archivo XML con la función simplexml_load_file()

En este ejemplo vamos a leer un archivo XML local, es decir, almacenado en nuestro equipo. El archivo en cuestión tiene la siguiente estructura:

<?xml version="1.0" encoding="UTF-8" ?>
<estudiantes>
	<estudiante estado="Activo">
		<identificacion tipo="Extranjero">1-2345-6789</identificacion>
		<nombre>Cali</nombre>
		<apellidos>Rojas</apellidos>
		<genero>Masculino</genero>
		<nota>94.5</nota>
	</estudiante>
</estudiantes>

El contenido del archivo XML lo he reducido para no hacer muy larga la entrada, pero la idea es que contenga una lista de al menos cinco estudiantes para poder hacer la prueba y recorrer los nodos. Al final del artículo van a poder descargar el ejemplo completo con los archivos XML y el código PHP necesario.

Ahora sí, aquí viene la parte en la que entra la extensión SimpleXML de PHP a convertir el contenido del archivo XML en objeto para poder acceder al contenido de sus nodos.

<?php
	//cargamos el archivo por medio de la funcion simplexml_load_file
	if($xmlEstudiantes=@simplexml_load_file('xml/prueba-local.xml')){
		//seleccionamos todos los nodos estudiante
		$objEstudiantes=$xmlEstudiantes->estudiante;					
		//utilizamos un foreach para recorrer los elementos obtenidos
		foreach($objEstudiantes as $objEstudiante){
			//imprimimos una fila con el contenido
			//los nombres y apellidos los decodificamos con utf8_decode
			//esto es simplemente para que sea vean bien los acentos que puedan
			//contener estos dos datos
			echo '
				<tr>
					<td>'.
						$objEstudiante->identificacion.
						' <em>('.$objEstudiante->identificacion['tipo'].')</em>'.
					'</td>
					<td>'.utf8_decode($objEstudiante->nombre).'</td>
					<td>'.utf8_decode($objEstudiante->apellidos).'</td>
					<td>'.$objEstudiante->genero.'</td>
					<td>'.$objEstudiante['estado'].'</td>
				</tr>
			';
		}
		
		//liberamos el objeto de la memoria
		unset($xmlEstudiantes);
	}else{
		echo '
			<tr>
				<td colspan="5" align="center">Error al leer el archivo.</td>
			</tr>
		';
	}
?>

Nótese que para imprimir los nombres y apellidos estamos utilizando la función utf8_decode(). Esto es para que, si en el archivo XML tenemos apellidos y nombres con acentos (como es nuestro caso), se vean de forma correcta a la hora de mostrarlos en pantalla. Según el sitio oficial de PHP esta es la definición de la función: convierte una cadena con los caracteres codificados ISO-8859-1 con UTF-8 a un sencillo byte ISO-8859-1.

Leer atributos de un nodo XML con PHP

Como mencioné antes, la función simplexml_load_file() de PHP convierte el XML en un objeto, y es por ello que al contenido de los nodos accedemos utilizando el operador -> (para clases y objetos). Puede verse claramente que los nodos son interpretados como propiedades. De igual forma, estas propiedades o nodos pueden contener atributos, como es el caso de los nodos identificacion y estudiante:

<identificacion tipo="Extranjero">1-2345-6789</identificacion>

En el código PHP que mostré más arriba podemos observar que estamos accediendo a los atributos de los nodos estudiante e identificacion. A los atributos se accede como si fuese un Array asociativo, ejemplo:

//leer el atributo estado del nodo estudiante
$objEstudiante['estado'];
//leer el atributo tipo del nodo identificacion
$objEstudiante->identificacion['tipo'];

Esto de leer los atributos de un nodo XML con PHP no está para nada complicado. Si tienen alguna duda pueden descargar el ejemplo completo para analizarlo o dejar sus dudas al final del artículo, utilizando el formulario para comentarios.:

Código completo para leer un XML con PHP

El código PHP está comentado, pero cualquier duda la pueden dejar al final.

Código HTML/PHP para leer un archivo XML con SimpleXML

<!DOCTYPE html>
<html>
	<head>
		<title>Ejemplo para leer un XML con PHP - www.lewebmonster.com</title>
		<link rel="stylesheet" type="text/css" href="css/leer-xml.css">
	</head>
	<body>
		<div id="divContenedor">
			<div id="divInfo">
				<h1>Leer un XML con PHP y la extensi&oacute;n SimpleXML</h1>
				<p>Ejemplo por Cali Rojas - <a href="http://www.lewebmonster.com">www.lewebmonster.com</a></p>
			</div>
			<div id="divTabla">
				<table width="100%">
					<thead>
						<tr>
							<th>Identificaci&oacute;n</th>
							<th>Nombre</th>
							<th>Apellidos</th>
							<th>G&eacute;nero</th>
							<th>Estado</th>
						</tr>
					</thead>
					<tbody>
					<?php
						//cargamos el archivo por medio de la funcion simplexml_load_file
						if($xmlEstudiantes=@simplexml_load_file('xml/prueba-local.xml')){
							//seleccionamos todos los nodos estudiante
							$objEstudiantes=$xmlEstudiantes->estudiante;					
							//utilizamos un foreach para recorrer los elementos obtenidos
							foreach($objEstudiantes as $objEstudiante){
								//imprimimos una fila con el contenido
								//los nombres y apellidos los decodificamos con utf8_decode
								//esto es simplemente para que sea vean bien los acentos que puedan
								//contener estos dos datos
								echo '
									<tr>
										<td>'.
											$objEstudiante->identificacion.
											' <em>('.$objEstudiante->identificacion['tipo'].')</em>'.
										'</td>
										<td>'.utf8_decode($objEstudiante->nombre).'</td>
										<td>'.utf8_decode($objEstudiante->apellidos).'</td>
										<td>'.$objEstudiante->genero.'</td>
										<td>'.$objEstudiante['estado'].'</td>
									</tr>
								';
							}
							
							//liberamos el objeto de la memoria
							unset($xmlEstudiantes);
						}else{
							echo '
								<tr>
									<td colspan="5" align="center">Error al leer el archivo.</td>
								</tr>
							';
						}
					?>
					</tbody>
					<tfoot>
						<tr>
							<td colspan="5">
								Ejemplo para leer archivos XML con PHP y SimpleXML
							</td>
						</tr>
					</tfoot>
				</table>
			</div>
		</div>
	</body>
</html>

Código CSS para leer archivos XML con PHP

*{
	padding: 0;
	margin: 0;
}
body{
	font: normal 12px Tahoma, Verdana, Arial, sans-serif;
}
h1{
	font-size: 20px;
}
a{
	color: #f00;
}

#divContenedor{
	width: 650px;
	margin: 0 auto;
	margin-top: 50px;
}
	#divInfo{
		text-align: center;
		padding-bottom: 10px;
	}
	#divTabla{
		
	}
		table{
			border-radius: 3px;
			border: solid 1px #f1f1f1;
			box-shadow: 0 0 10px #333;
			margin: 10px;
		}
			table a{
				color: #fff;
			}
			table thead tr th,
			table tfoot tr td{
				padding: 15px 0;
				background-color: #314456;			
				color: #fff;
				font-weight: bold;
				font-size: 11px;
				text-align: center;
				min-width: 10px;
			}
				table tbody tr td{
					transition: all 400ms ease-in;
						-webkit-transition: all 400ms ease-in;
						-moz-transition: all 400ms ease-in;
						-o-transition: all 400ms ease-in;
						-ms-transition: all 400ms ease-in;
					padding: 10px 5px;
					word-wrap: break-word;
					border: solid 0px #fff;
					border-bottom: solid 1px #fff;
					border-top: solid 1px #f1f1f1;
					border-right: solid 1px #f1f1f1;
				}
					table tbody tr td:nth-child(odd){
						background-color: #fff;
					}
					table tbody tr td:nth-child(even){
						background-color: #fafafa;
					}
						table tbody tr:hover td:nth-child(odd),
						table tbody tr:hover td:nth-child(even){
							background: #7290ae;
							color: #fff;
						}

Archivo XML que leemos con PHP y SimpleXML

<?xml version="1.0" encoding="UTF-8" ?>
<estudiantes>
	<estudiante estado="Activo">
		<identificacion tipo="Extranjero">1-2345-6789</identificacion>
		<nombre>Cali</nombre>
		<apellidos>Rojas</apellidos>
		<genero>Masculino</genero>
		<nota>94.5</nota>
	</estudiante>
	<estudiante estado="Activo">
		<identificacion tipo="Nacional">2-3456-7890</identificacion>
		<nombre>María</nombre>
		<apellidos>Brenes</apellidos>
		<genero>Femenino</genero>
		<nota>98</nota>
	</estudiante>
	<estudiante estado="Inactivo">
		<identificacion tipo="Nacional">3-4567-8901</identificacion>
		<nombre>Marco</nombre>
		<apellidos>Jiménez</apellidos>
		<genero>Masculino</genero>
		<nota>78.4</nota>
	</estudiante>
	<estudiante estado="Activo">
		<identificacion tipo="Extranjero">9-8765-4321</identificacion>
		<nombre>Arturo</nombre>
		<apellidos>Vargas</apellidos>
		<genero>Masculino</genero>
		<nota>100</nota>
	</estudiante>
	<estudiante estado="Inactivo">
		<identificacion tipo="Extranjero">6-5432-1012</identificacion>
		<nombre>Gabriela</nombre>
		<apellidos>Smith</apellidos>
		<genero>Femenino</genero>
		<nota>80</nota>
	</estudiante>
</estudiantes>

Enlaces

Escrito por Cali Rojas

Cali Rojas

Senior Front-End/Back-End Web Developer y diseñador de GUI’s, nacido en Costa Rica. Utilizo tecnologías como JavaScript Orientado a Objetos, HTML5, CSS3 y jQuery; MySQL, PHP, Python, LESS, SASS, etc. Linuxero por elección (Debian). Autor de jsmConsole (JavaScript Mobile Console) y Mopix.js (Mobile Pixel Perfect). Fundador de este blog.

VN:F [1.9.22_1171]
Rating: 4.8/5 (5 votes cast)
VN:F [1.9.22_1171]
Rating: +5 (from 5 votes)
¿Cómo leer XML haciendo uso de PHP y la extensión SimpleXML?, 4.8 out of 5 based on 5 ratings

Compartir este artículo

Si le pareció interesante el contenido de este artículo, por favor, compártalo con sus amigos y conocidos por medio de las principales redes sociales.

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Artículos relacionados

Categorías: PHP

9 comentarios hasta el momento. Haga clic aquí para ver u ocultar los comentarios.

  1. Jonathan dice:

    Hola Cali Rojas, la verdad muy bueno tu articulo, de todos los que eh visto en la web el tuyo es el que mejor eh podido entender, yo tengo una pregunta, si el archivo xml no lo tengo yo si no en un servidor remoto, como lo podriamos leer y pasar los datos a mi web?

    Muchas gracias por tu ayuda.

  2. Jonathan dice:

    Hola, muchas gracias, es el primer tutorial que veo en el cual le entiendo perfectamente, muy bien explicado, solo tengo una duda, Si el archivo xml no lo tengo en local y esta en un servidor y solo tengo la url, como lo jalo eh imprimo? Gracias

  3. Jonathan Espinosa dice:

    Hola Cali, muchas gracias por este tutorial, es el primero en la web al que le entiendo perfectamente, muy bien explicado, solo una pregunta, si el xml no lo tengo local y esta como url en un servidor remoto, como lo jalo? gracias.

  4. roxhp dice:

    Esta genial, me sirvio mucho, solo que yo tengo un problema enorme poque intento leer un archivo xml creado x medio de la facturacion electronica en mexico y me da problemas en las etiquetas.

    el archivo viene mas o menos asi:

  5. Landa dice:

    Hola, una pregunta:

    Se puede hacer una consulta de un RFC que viene en un archivo XML con código de PHP o JS? Que al momento de escribir tu RFC lo consulte en los archivos almacenados en una carpeta?

  6. felix_22 dice:

    Hola Cali, excelente tutorial, muy bien explicado. Una consulta como recepciono con php, si me enviaron un parametro con formato xml(no archivo xml) con ajax.

  7. Nacho dice:

    Hola Cali, gracias por tu artículo, solo una duda, si en lugar de un archivo local, lo que queremos es mostrar en una página los datos de una url xml como por ejemplo: dominio.tld/cgi-bin/feed.xml
    Que habría que cambiar en el código?

    Gracias y saludos

  8. ItzelAudelo dice:

    Muchas gracias! Está super claro. Te felicito.

Deje un comentario

Su información personal no será compartida con otros sitios y/o personas.