Lo primero de lo que hay que asegurarnos es de que el XML que vamos a parsear es válido. Esto significa que debe estar bien formado (un sólo elemento raíz, etiquetas abiertas y cerradas correctamente, anidaciones válidas, etc) y debe obedecer a un DTD. Después de segurarnos de esto, lo que sigue es trabajar sobre PHP5.

¿Por qué PHP5? por dos razones, una, nos da una orientación a objetos más eficiente que la versión 4 y, dos, nos provee de la extensión SimpleXMLElement que es con la trabajaremos el XML. ¿A caso PHP4 no tiene extensiones que hagan lo mismo? No lo sé, ni me interesa. PHP5 es mejor.

Bien, empecemos. Supongamos que tenemos un archivo XML llamado library.xml con el siguiente contenido:



	
		Fahrenheit 451
		R. Bradbury
		Del Rey
	
	
		The Silmarillion
		J.R.R. Tolkien
		G. Allen & Unwin
	
	
		1984
		G. Orwell
		Signet
	
	
		Frankenstein
		M. Shelley
		Bedford
	
	
		The Moon Is a Harsh Mistress
		R. A. Heinlein
		Orb
	

Y supongamos que lo que queremos hacer es una tabla con todos los libros y sus respectivos datos:

Title Author Publisher ISBN
Fahrenheit 451 R. Bradbury Del Rey 0345342968
The Silmarillion J.R.R. Tolkien G. Allen & Unwin 0048231398
1984 G. Orwell Signet 0451524934
Frankenstein M. Shelley Bedford 031219126X
The Moon Is a Harsh Mistress R. A. Heinlein Orb 0312863551

 

Para lograrlo debemos hacer una instancia de la clase SimpleXMLElement.

El constructor recibe 5 parámetros aunque solo nos interesan 2 (el primero y el tercero). El primero es donde indicamos la dirección URL del archivo XML o la cadena XML que vamos a leer. El segundo argumento no tiene aplicación práctica para este ejemplo y el tercero es solo para informar al constructor que (en este caso particular) el primer parámetro es una ruta a un archivo y no una cadena XML.

// Carga un archivo XML
$library = new SimpleXMLElement('library.xml', null, true);

Aquí viene lo interesante, el acceso a los hijos y atributos. He aquí por qué SimpleXMLElement hace magia; convierte a todos los nodos del árbol XML en atributos de clase y los atributos del XML mismo los convierte en variables a las que podemos acceder como arreglos asociativos.

Si hasta aquí todo va claro, entonces ya tenemos las bases para manipular de forma sencilla el archivo de la biblioteca para mostrar los libros en una tabla. Y nos debería quedar algo así:

	$library = new SimpleXMLElement('library.xml', null, true);
	echo '';
	echo '';
	echo '';
	echo '';
	foreach($library->book as $book) {
		echo '';
		echo '';
		echo '';
		echo '';
		echo '';
		echo '';
	}
	echo '
TitleAuthorPublisherISBN
' .$book->title. '' .$book->author. '' .$book->publisher. '' .$book['isbn']. '
';

El problema ahora sería, ¿qué pasa si no conocemos todos los nombres de los elementos ni los atributos? La clase SimpleXMLElement tiene la solución. Los métodos SimpleXMLElement::children() y SimpleXMLElement::attributes() así como el método recien introducido en PHP5.1.3 SimpleXMLElement::getName() nos ayudarán en gran medida.

Como bien se sobreentiende, el método children() regresa los nodos hijos de elemento actual. El método attributes() regresa los atributos del elemento actual y el método getName() el nombre del elemento actual.

Todos se pueden aplicar recurrentemente dependiendo del nivel de anidación de los elementos. Es decir, si estamos en el elemento $x, y llamamos a $x->children() obtendremos a los hijos de $x, y si a uno de esos hijos le aplicamos el children() obtendremos los nietos de $x, y así sucesivamente.

Hasta aquí llega el microtutorial de hoy que ha servido para ver cómo parsear una cadena de XML para leerla nada más. La próxima semana escribiré cómo modificar documentos XML.

Si desean echar un vistazo a la clase completa:
http://php.net//manual/es/class.simplexmlelement.php