Ir al contenido principal

Leer un archivo XML con jQuery y javascript y modificar un HTML con su contenido

   Una manera muy interesante y fácil de modificar los textos de tu página web. Si, por ejemplo, tenemos una página donde cambiamos a menudo unas noticias que tenemos en el margen derecho, podríamos tener un código HTML como este:

  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Manejar archivo XML</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="leerxml.js"></script>
<link rel="stylesheet" href="estilos.css">
</head>

<body>
<h1>Titulo de la página</h1>
<div id="derecha">
<div class="noticias">
<div class="primera"></div>
<div class="segunda"></div>
<div class="tercera"></div>
<div class="cuarta"></div>
</div>
</div>
</body>
</html>

donde podríamos tener, dentro de cada div 'primera', 'seguna', 'tercera', etc... noticias con diferente formato según su importancia.

   Para rellenar cada div con la noticia deseada podriamos bastaría con abrir la página con un editor y modificar los textos, así de sencillo.

   Pero vamos a imaginar que dicha página contiene muchas lineas de código, o que la página se genera mediante código PHP y que nos lleva tiempo indagar en él y encontrar los divs, o que de la actualización de las noticias se encarga alguien que no queremos que husmee en la página y pueda modificar, sin querer, algo que no nos interesa. Pues para esto podemos tener el contenido de los divs, es decir, el texto de las noticias, en un archivo XML. Un código sencillo, válido para rellenar los anteriores divs podría ser algo como:

<?xml version="1.0" encoding="utf-8"?>
<noticias>
<noticia>
<primera>
<titulo>Titulo primera noticia</titulo>
<texto>Este seria el texto de la noticia destacada como primera</texto>
</primera>
</noticia>
<noticia>
<segunda>
<titulo>Titulo segunda noticia</titulo>
<texto>Este el texto de la segunda noticia</texto>
</segunda>
</noticia>
<noticia>
<tercera>
<titulo>Titulo tercera noticia</titulo>
<texto>Y así sucesivamente con las demás....</texto>
</tercera>
</noticia>
</noticias>


   No voy a ahondar en la estructura y forma de los archivos XML ya que existen webs a patadas donde lo explican. Aquí sólo voy a explicar cómo leer estos archivos, extraer los textos y rellenar los divs del HTML con ellos usando javascript. Y, en este caso, también vamos a trabajar con ciertas etiquetas del código XML que nos servirán para situar cada noticia en su lugar ya que queremos que, según la importancia de la noticia, esta tenga una presentación diferente. En este ejemplo las noticias etiquetadas como primera, segunda, tercera, etc..., se corresponden con las clases de los divs en el código HTML.
   Al anterior código XML deberíamos darle un nombre que nos indique qué contiene, por ejemplo 'noticias.xml'. Y lo leeremos con el  siguiente código jQuery y javascript:

// JavaScript Document
// Nombre del archivo: leerxml.js

$(document).ready(function(){//se empieza a ejecutar cuando el DOM esté listo

$.get("noticias.xml",{},function(xml){ //Abrimos el archivo noticias.xml

//El ciclo se va repetir cada vez que se encuentre la etiqueta noticia
$('noticia',xml).each(function() {
etiqueta=$(this).children();//obtenemos el elemento hijo de noticia que se corresponde
// con el nombre de la clase en el código HTML (en este caso primera, segunda, tercera, etc...
etiqueta=etiqueta[0].nodeName.toLowerCase();//y conseguimos su nombre (nodeName) en minúsculas (toLowerCase)
titulo = $(this).find('titulo').text(); //buscamos el valor que contiene la etiqueta titulo y lo guardamos en la variable titulo
texto = $(this).find('texto').text(); //lo mismo con texto

//Llama a la función que retorna el título y texto que vamos a insertar en el DIV
datos = crearNoticiaHtml(titulo,texto);
$('.'+etiqueta).append(datos);//insertamos el titulo y el texto en el DIV correspondiente 
// (añadimos un punto antes del nombre de la etiqueta porque es una clase)
}); //final de leer cada etiqueta noticia
}); //fin de $.get
});//fin de document ready

function crearNoticiaHtml(titulo,texto){

// Construimos el string 'noticiaHTML' que contiene el titulo y el texto y lo retornamos
noticiaHTML = ' '; //inicializamos la variable
noticiaHTML += '<h4>'+ titulo + '</h4>';//le agregamos el título con formato
noticiaHTML += texto;//y el texto
return noticiaHTML;//y lo retornamos
}
//con esto la noticia etiquetada en el xml como <primera> quedará insertada 
//en el div con class=primera, la etiquetada como <segunda> en el div con la clase .segunda 
//y así sucesivamente
 Como veis, usando jQuery, el código se simplifica mucho. Con esto lo que conseguimos es leer el archivo XML, extraer los textos e insertarlos en los divs correspondientes de nuestra página. Creo que el código está lo suficientemente explicado (si tenéis alguna duda dejad un comentario). Solo decir que,  la línea del código HTML, donde llamo a cargar el archivo jQuery, es la versión con la que necesitamos tener conexión a internet. En este caso hay que tener en cuenta que las versiones de jQuery se actualizan cada cierto tiempo, entonces puede ocurrir que no se recupuere el archivo desde Google porque no existe. Podéis verificar la ruta y el nombre correcto en la siguiente página: https://developers.google.com/speed/libraries/devguide#jquery.

Comentarios

  1. Hola, desde hace unos dias busco un codigo que haga algo semejante a lo que usted describe en esta pagina, como soy nuevo en esto no se como armar el rompe cabeza final, usted podria ser tan amable de presetar un ejemplo funcionando en su web, o facilitarme demo

    ResponderEliminar
  2. Hola de nuevo, logre realizar el ejercicio correctamente, gracias por haber descrito tan didaticamente esta pagina. Me ha servido de mucho. Ahora le do formato CSS a los contenido del XML. Cualquier idea que me pueda ayudar la acogere con gusto.

    ResponderEliminar
  3. Hola, la verdad es que está muy bien montado el código, lo que pasa es que no es compatible con Chrome. ¿Alguna idea sobre como solucionar este problema de compatibilidad? ¿alguna referencia? Muchas gracias.

    ResponderEliminar
  4. Hola Javi, el problema en Chrome es que cuando abres un documento html local (que está en una carpeta de tu disco duro y no en un servidor) que intenta acceder a través de JavaScript a algún archivo (como un xml), emite un error de seguridad del tipo (o similar):

    Origin null is not allowed by Access-Control-Allow-Origin.

    Ese error lo verás en la consola cuando abras el menú: 'herramientas', 'herramientas para desarrolladores'.

    Es un problema común del chrome, cuando subes la página a un servidor el problema desaparece. Te invito a que hagas tus pruebas con el Firefox.

    ResponderEliminar
  5. Hola, excelente el post, solo que solo funciona con un XML alojado en el mismo servidor... ¿Como puedo hacerlo funcionar con un XML de un servidor remoto?
    Gracias.

    ResponderEliminar
    Respuestas
    1. Aqui te pongo una página de stackoverflow donde se soluciona con un pequeño proxy php (funciona de maravilla).

      http://stackoverflow.com/questions/12683530/origin-http-localhost-is-not-allowed-by-access-control-allow-origin

      Eliminar
  6. Waaauu! me sirvió bastante para hacer otra cosa que tiene que ver con archivos xml. Muchas Gracias!!

    ResponderEliminar
  7. Se ve bastante interesante, pero me gustaría saber cómo se haría con Vanilla JS.

    ResponderEliminar
  8. Se ve bastante interesante, pero me gustaría saber cómo se haría con Vanilla JS.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Recargar div con efecto de aparición suave (Fade In) en jQuery

  En este post continúo con el código que describí en el segundo post sobre cómo refrescar un div sin necesidad de refrescar toda la página, pero añadiéndole unas lineas para este se aparezca de forma suave. La página de ejemplo es http://www.talleresguadamia.com y el código es el que sigue: <script type="text/javascript"> $(document).ready(function(){    $("#contenido a").each(function(){       var href = $(this).attr("href");       $(this).attr({ href: "#"});       $(this).click(function(event){                  $("#contenido").css("display","none");          $("#contenido").load(href).fadeIn(700);        });    }); });; </script>   Podéis ver lo fácil que es. Hemos agregado sólo dos cosas:   - La linea  "$('#contenido').css('display','none')", que lo único que hace es cambiar la propiedad css "display" del div "#contenido&q

Código jQuery para ver una imagen al pasar el ratón sobre un enlace.

   Voy a explicar un código en jQuery , para que, al pasar el puntero del mouse sobre un enlace o, en este caso, sobre un texto cualquiera (sin necesidad de ser un enlace), se nos muestre una imagen cerca del enlace y que esta desaparezca al retirar el puntero del mouse (sin necesidad de hacer click sobre él). Podéis pensar que me estoy repitiendo con un anterior post. Casi que si. Pero la diferencia es que, en este caso, no sabemos donde estará situada la imagen. Es decir que, dependiendo de la situación de la pantalla donde esté el enlace o texto, allí se mostrará la imagen.    Vamos al grano. Primero el código en HTML:       <span class="enlace" title="hyneria.png">Hyneria</span>    Podéis ver que, en este caso, no se trata de un enlace. Le pongo el nombre de 'enlace' a la clase porque en el CSS le doy apariencia de enlace. Aquí lo importante es 'title' el cual contiene el nombre de la imagen que queremos mostrar (pod