Bien este es un ejemplo de como parsear un archivo xml, para nuestro caso llamado espanols.xml, esto lo estoy implementando para un traductor de idiomas en un proyecto que me encuentro desarrollando, espero te sirva.
Archivo XML: Crea este archivo y almacenalo en el directorio en donde crearas tu script PHP, ha este archivo XML ponle el nombre
espanols.xml y listo.
<?xml version="1.0" encoding="UTF-8"?>
<lenguaje idioma="Espanol">
<titulo_navegacion_usuario>
<p sub="pla_ele">PLATAFORMA E-LEARNING</p>
<p sub="usu">Usuarios</p>
<p sub="map_sit">Mapa del sitio</p>
<p sub="ing_aul">Ingrese al Aula Virtual</p>
</titulo_navegacion_usuario>
<menu_lateral_administrador>
<p sub="foro">Foros</p>
<p sub="chat">Chat</p>
<p sub="conf">Configurar</p>
<p sub="sist">Sistema</p>
<p sub="perf">Perfil</p>
<p sub="db">DB</p>
<p sub="usu">Usuarios</p>
<p sub="tod">Todos</p>
<p sub="ser">Servicios</p>
<p sub="bus">Buscar</p>
<p sub="ali">Eliminar</p>
<p sub="ayu">Ayuda</p>
<p sub="imp">Imprimir</p>
</menu_lateral_administrador>
</lenguaje>
Y el codigo PHP que analiza & parsea (lee) el archivo XML es este, todo esto lo estoy haciendo con el fin de poder leer una seccion del archivo XML, es decir no parsear totalmente el documento XML, pero si se desea parsear todo el documento XML entonces en las siguientes lineas de codigo se envia el valor de la variable $seccion vacia es decir asi:
Código PHP:
$idioma="espanols.xml";
$seccion="";
$objeto=new Leer_XML($idioma,$seccion);
Codigo PHP, recuerda crear el archivo XML. Este script se almacena en el mismo directorio del archivo XML.
Código PHP:
/******************************************************************************/
//Ninguna seccion tiene un mismo nombre, asi como los valores del atributo [sub] tampoco son iguales
class Leer_XML{
var $parser;//Analizador gramatical: Libreria Expat. SAX & DOM: La diferencia es que SAX no consume tanto recursos (Mamoria al generar una estructura de arbol que genera el DOM)como el DOM
var $seccion_traducir;//Esta es la seccion de la interfaz de usuario que se va a traducir
var $almacenar_array;//Esta variable determina si se va a utilizar todos los parametros del archivo XML o una seccion en particular del archivo XML
var $tamano;//Tamaño que ocupa en disco el archivo XML
var $fp;//Devuelve un apuntador al archivo XML especificado
/******************************************************************************/
function Leer_XML($idioma,$seccion){
$this->seccion_traducir=$seccion;
if($this->seccion_traducir=="")//Si no se selecciona una seccion, entonces se utilizaran todos los parametros del documento XML
$this->almacenar_array=1;//Analizar & Extraer los datos del documento XML
/******************************************************************************/
$this->parser=xml_parser_create();
xml_set_object($this->parser,$this);
xml_set_element_handler($this->parser,"tag_abre","tag_cierra");
xml_set_character_data_handler($this->parser,"contenido");
/******************************************************************************/
if(!file_exists($idioma))
die("<b>No se puede encontrar el archivo $idioma</b>");
if(!($this->fp = @fopen($idioma, "r")))
die("<b>No se puede abrir el archivo $idioma</b>");
//Tamaño del Archivo XML a analizar
$this->tamano=filesize($idioma);
//echo $this->tamano;
while(($data = fread($this->fp, 50)))://Lee 512 bytes
if(!xml_parse($this->parser, $data, feof($this->fp)))://Si el archivo xml esta erroneo entra al if
echo "<b>El archivo XML esta mal formado</b>";//El archivo XML esta dañado o mal formado
fseek ($this->fp, $this->tamano);
endif;
endwhile;
fclose($this->fp);
/******************************************************************************/
}
/******************************************************************************/
function tag_abre($parser, $nombre, $atributos){
global $tag_abre;
global $contenido;
global $subindice;
if($this->seccion_traducir==$nombre)//Esto es para una seccion en particular
$this->almacenar_array=1;
/*******************************************/
//Se extraen datos de una seccion en particular o de todo el documento XML
if($this->almacenar_array==1):
$contenido="";
$tag_abre=$nombre;
if($atributos!=""):
list (,$subindice) = each ($atributos);
$subindice=($subindice!="")?$subindice:0;
endif;
endif;
/*******************************************/
}
/******************************************************************************/
function contenido($parser, $valor){//Almacena todo el contenido para un par de etiquetas [Apertura,Cierre]
/*******************************************/
//Analiza el documento XML mientras el valor de la variable $this->almacenar_array sea igual a 1
//echo "<b>$valor</b><br>";
if($this->almacenar_array==1):
global $contenido;
global $tag_abre;
$contenido.=$valor;
endif;
/*******************************************/
}
/******************************************************************************/
function tag_cierra($parser, $nombre){
if($this->almacenar_array==1):
global $contenido;
global $tag_abre;
global $palabras;
global $subindice;
if($tag_abre==$nombre&&$subindice!="NO")://[Las etiquetas de apertura y cierre son iguales]
echo "<$tag_abre>$contenido</$nombre><br>";
$palabras[$subindice]=$contenido;
endif;
endif;
if($this->seccion_traducir==$nombre):
$this->almacenar_array=0;//Asigna este valor para que ya no se pueda seguir analizando el documento XML
fseek ($this->fp, $this->tamano);
endif;
}
}//Fin Clase Leer_XML
/******************************************************************************/
/******************************************************************************/
$idioma="espanols.xml";
$seccion="TITULO_NAVEGACION_USUARIO";
$objeto=new Leer_XML($idioma,$seccion);
Exitos...