Facendo uso da clase SimpleXML (http://es.php.net/manual/es/book.simplexml.php) pódese percorrer de forma sinxela un XML. Para isto temos que crear un obxeto da clase SimpleXMLElement, inicializándoo ben cun String que conteña o XML (new SimpleXMLElement(string) ) ou ben co nome do ficheiro que conteña o XML ( new SimpleXMLElement(ficheiro,NULL,True) ). Tamén dispoñemos de dúas funcións que obteñen o mesmo obxeto (simplexml_load_string(string) e simplexml_load_file(ficheiroXML)).

Unha vez obtido o obxeto SimpleXMLElement, podemos acceder o nome de cada nodo, os seus atributos e os seus sobnodos cos métodos do obxeto:

  • SimpleXMLElement->getName() para obter o nome do nodo
  • SimpleXMLElement->attributes() para obter un array cos atributos do nodo
  • SimpleXMLElement->children() para obter un array cos subnodos dun nodo dado
  • Se temos o seguinte XML:

    <?xml version="1.0" ?>
    <libraria>
    	<libro isbn="0345342968">
    		<titulo>Fahrenheit 451</titulo>
    		<autor>R. Brandbury</autor>
    		<editor>Del Rey</editor>
    	</libro>
    	<libro isbn="0048231398">
    		<titulo>The Silmarillion</titulo>
    		<autor>J.R.R. Tolkien</autor>
    		<editor>G. Allen and Unwin</editor>
    	</libro>
    	<libro isbn="0451524934">
    		<titulo>1984</titulo>
    		<autor>G. Orwell</autor>
    		<editor>Signet</editor>
    	</libro>
    	<libro isbn="031219126X">
    		<titulo>Frankenstein</titulo>
    		<autor>M. Shelley</autor>
    		<editor>Bedford</editor>
    	</libro>
    	<libro isbn="0312863551">
    		<titulo>The Moon Is a Harsh Mistress</titulo>
    		<autor>R. A. Heinlein</autor>
    		<editor>Orb</editor>
    	</libro>
    </libraria>
    

    Podemos percorrelo facendo uso dos obxetos e métodos vistos anteriormente:

    $libraria = new SimpleXMLElement('ficheiro.xml',NULL,true);
    procesar_Nodo($libraria);
    
    function procesar_Nodo($nodo) {
    	echo "<b>NODO :</b>".$nodo->getName() . "<br />";
    	// SE TEN ATRIBUTOS
    
    	if (count($nodo->attributes()) > 0) {
    		echo "<b>atributos :</b><br />";
    		foreach ($nodo->attributes() as $atributo) {
    			echo "  --<b>".$atributo->getName() ."</b>: ". $atributo . "<br />";
    		}
    	}
    
    	// SE NON TEN FILLOS IMPRIMESE O CONTIDO
    	if (count($nodo->children()) == 0) {
    		echo $nodo . "<br />";
    	}
    	foreach($nodo->children() as $subnodo) {
    		procesar_Nodo($subnodo);
    	}
    }