Como leer (parsear) archivos XML iso 8859-1 en PHP con SimpleXMLElement UTF-8

7 10 2008

Bueno aquí luego de estar medio día tratando de parsear un archivo XML con SimpleXMLElement, finalmente:

Tengo un Xml con iso 8859-1, entonces la idea es leer el archivo con PHP, parsearlo y proceder a imprimir algunos datos en pantalla utilizando el arreglo generado del arbol Xml.

El ejemplo de XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<graficos>
<grafico id="idgrafo1">
    <titulo>Título Gráfico 1</titulo>
    <subtitulo>Subtítulo grafo 1</subtitulo>
    <fuente>Fuente grafo 1</fuente>
    <datos>
        <dato>
            <x>110</x>
            <y>111</y>
        </dato>
        <dato>
            <x>120</x>
            <y>100</y>
        </dato>
    </datos>
</grafico>
<grafico id="idgrafo2">
    <titulo>Título Gráfico 2</titulo>
    <subtitulo>Subtítulo grafo 2</subtitulo>
    <fuente>Fuente grafo 2</fuente>
    <datos>
        <dato>
            <x>210</x>
            <y>211</y>
        </dato>
        <dato>
            <x>220</x>
            <y>200</y>
        </dato>
    </datos>
</grafico>
</graficos>

Ahora con PHP, tenemos que leer primero el archivo podemos utilizar varias funciones, como es un archivo pequeño y no va ser utiliado muchas veces, utilizo la función read_file

una vez que hayamos leído todo el contenido del archivo XML, tenemos que parsearlo utilizando la función SimpleXMLElement, hay que tener en cuenta que el XML está en ISO-8859 1 y una vez que se parsee el archivo la función SimpleXMLElement, devuelve un arreglo codificado en UTF-8, por lo que si se desea ver las tildes en caso que existan en el XML se tedrá que decodificar al momento de imprimir en pantalla

     //variable utilizada para leer guardar el contenido del archivo en memoria
     $buffer="";

    //Variable que posee la ruta absoluta del archivo xml a parsear
    $ruta_xml="";

    if (file_exists($ruta_xml)) {
        $fh = fopen($ruta_xml, 'r');
        $buffer = fread($fh, filesize($file));
        fclose($fh);
      }else{
        print("No existe archivo XML");
        exit();
      }

    // Parseando el contenido del archivo XML con la función SimpleXMLElement que devuelve un arreglo codificado en UTF-8
    $xml = new SimpleXMLElement($buffer); 

     //Liberando a la variable del espacio en memoria
     unset($buffer);

     //Luego para acceder a los datos del archivo en PHP

	print($xml->grafico[0]->titulo);
	print($xml->grafico[0]->subtitulo);
	print($xml->grafico[0]->fuente);

        print($xml->grafico[0]->datos->dato[0]->x);
	print($xml->grafico[0]->datos->dato[0]->y);

    //Acceder a todos los datos recursivamente
         $i=0;
	foreach ($xml as $xml_datos) {
		print("Gráfico número: ".++$i);

                //Ejemplo de comparación del atributo "id" para identificar al gráfico y llamar a otra función o hacer cualquier cosa
                 if ($xml_datos['id']=="idgrafo1"){
                      printGrafo1($xml_datos);
                 }
               //Imprimiendo codificados en UTF-8
		print($xml_datos['id']);
		print($xml_datos->titulo);
		print($xml_datos->subtitulo);
		print($xml_datos->fuente);

               //Imprimiendo decodificando en ISO-8859 1 -  Latin 1
		print(utf8_decode($xml_datos['id']));
		print(utf8_decode($xml_datos->titulo));
		print(utf8_decode($xml_datos->subtitulo));
		print(utf8_decode($xml_datos->fuente));

                //Imprimiendo en UTF-8, en caso que se requiera en iso-8859 1 decodificar con la función  utf8_decode
                foreach ($xml_datos->datos->dato as $dato) {
		 print($dato->x);
		 print($dato->y);
		}
	}

//Eso es todo amigos!


Acciones

Información

Un comentario

12 03 2010
Gema Perez

Oye Amigo, Te ganaste un 10 de mi parte.. Gracias por tu aportacion me ayudo mucho

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s




Seguir

Get every new post delivered to your Inbox.