Que tal, hace tiempo compre el libro de Ajax Web2.0 para profesionales de Maximiliano Firtman, todo me funciono muy bn hasta el momento que quize mandar a llamar a un archivo PHP que devuelve un XML, no puedo realizar el Parseo de Datos ya que al parecer no los reconoce pero no entiendo por que si lo unico que hago es invocar a un archivo que devuelve XML y esto lo verifica mi biblioteca.. aqui les dejo el codigo de la biblioteca AJAX.
Código:
/**
*
* Librería AjaxLib v 1.0
*
* Realiza peticiones AJAX de manera sencilla y automática.
*
* @author Maximiliano R. Firtman [email protected]
*
*/
/** Especifica opciones para tipoRespuesta
*/
var $tipo = {
XML: 0,
TEXTO: 1,
JSON: 2
}
/** Especifica opciones para método
*/
var $metodo = {
GET: "GET",
POST: "POST"
}
/**
* Realiza un nuevo requerimiento AJAX a la url especificada
* con las opciones definidas
* @param {String} url La URL a donde realizar la petición
* @param {Object} opciones Un objeto JSON con los atributos opcionales que queremos definirle.
*
* opciones disponibles:
* id: Un identificador interno para ser recibido junto a los datos
* metodo: $metodo.POST o $metodo.GET
* tipoRespuesta: $tipo.TEXTO, $tipo.JSON o $tipo.XML
* parametros: un string en formato URL o un objeto Hash
* cache: true o false
* avisoCargando: define el id de un elemento que queremos usar
* como cartel de "Cargando" mientras la petición se hace
* onfinish: función a ejecutarse cuando se reciban los datos.
* Esta función recibirá el Texto, JSON o XML recibido y el id de la petición.
* onerror: función a ejecutarse cuando ocurra un error.
* Esta función recibe un objeto con detalles del error y el id de la petición
*/
function $Ajax(url, opciones) {
// Preguntamos si no quiere Caché
if (__$P(opciones, "cache", true)==false){
// Agregamos un parámetro random a la URL
// Ponemos ? o & según ya haya parámetro anteriores
var caracter = "?";
if (url.indexOf("?")>0) caracter = "&";
url += caracter + Math.random();
}
var metodo = __$P(opciones, "metodo", $metodo.GET);
var parametros = __$P(opciones, "parametros");
// Genera JSON de propiedades necesarias para Prototype
// En un futuro puede ser reemplazado por otra librería
var protoOpc = {
method: metodo,
onSuccess: __$AjaxRecibir.bind(this, opciones),
onException: __$AjaxError.bind(this, opciones),
onFailure: __$AjaxError.bind(this, opciones)
}
// Si se definieron los parámetros los agregamos
if (parametros!=undefined) {
protoOpc.parameters = parametros;
}
// Genera la nueva petición vía Prototype
var peticion = new Ajax.Request(url, protoOpc);
// Prende el cartel de Cargando, si existiera
if (__$P(opciones, "avisoCargando")!=undefined) {
__$AjaxCargando(opciones.avisoCargando, true);
}
}
/**
* Función interna que se encarga de recibir la petición lista
* desde Prototype y ejecutar el evento onfinish de la petición
*/
function __$AjaxRecibir(opciones, xhr) {
// Si se ejecuta este método estamos seguros que
// readyState==4 y status==200
// Apagamos cartel de Cargando si existiera
if (__$P(opciones, "avisoCargando")!=undefined) {
__$AjaxCargando(opciones.avisoCargando, false);
}
// Traemos la función onfinish si fue definida
var funcionRetorno = __$P(opciones, "onfinish");
// Traemos el identificador de la petición si fue definido
var id = __$P(opciones, "id");
if (funcionRetorno!= undefined) {
// Si el usuario indicó que quiere recibir la respuesta
// Suponemos TEXTO como tipo por defecto.
var tipoRespuesta = __$P(opciones, "tipoRespuesta", $tipo.TEXTO);
switch(tipoRespuesta) {
case $tipo.TEXTO:
funcionRetorno(xhr.responseText, id);
break;
case $tipo.XML:
funcionRetorno(xhr.responseXML, id);
break;
case $tipo.JSON:
// Intentamos evaluar el JSON por si no es válido
var objeto;
try {
objeto = xhr.responseText.evalJSON();
} catch (e) {
__$AjaxError(opciones, xhr, {code: -1, message: "JSON No válido" });
return;
}
funcionRetorno(objeto, id);
}
}
}
/**
* Función interna que se encarga de prender o apagar el cartel
* de Cargando, si existiera
*/
function __$AjaxCargando(cartel, prender) {
if (prender) {
$(cartel).show();
} else {
$(cartel).hide();
}
}
/**
* Función interna que se encarga de recibir la ejecución
* cuando ocurra algún error en la petición desde Prototype
*/
function __$AjaxError(opciones, xhr, excepcion) {
// Apagamos cartel de Cargando si existiera
if (__$P(opciones, "avisoCargando")!=undefined) {
__$AjaxCargando(opciones.avisoCargando, false);
}
// Cuando se trata de un error de servidor, no hay excepción
if (excepcion==undefined) {
// Supongo error de HTTP, genero mensaje propio
excepcion = {code: xhr.status, message: "Error del servidor"}
}
// Consulto si estaba definida el evento onerror
var funcionError = __$P(opciones, "onerror");
if (funcionError!=undefined) {
funcionError(excepcion, __$P(opciones, "id"));
}
}
/**
* Función interna que se encarga de entregar un parámetro opcional
* desde una colección tipo JSON, con un valor por defecto
*/
function __$P(coleccion, parametro, defecto) {
if (coleccion==undefined) {
return defecto;
} else {
if (coleccion[parametro]==undefined) {
return defecto;
} else {
return coleccion[parametro];
}
}
}
Asi mismo aqui les dejo el codigo del archivo XML
Código:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title><![CDATA[ELPAIS.com - Última Hora]]></title>
<link><![CDATA[http://www.elpais.com/loultimo/]]></link>
<description><![CDATA[ELPAIS.com - Última Hora]]></description>
<language>es-es</language>
<copyright><![CDATA[Copyright PRISACOM S.A]]></copyright>
<ttl>15</ttl>
<image>
<url>http://www.elpais.com/im/tit_logo.gif</url>
<title>ELPAIS.com - Última Hora</title>
<link>http://www.elpais.com</link>
</image>
<item>
<title><![CDATA[Un bebé con licencia de armas]]></title>
<link><![CDATA[http://www.elpais.com/articulo/internacional/bebe/licencia/armas/elpepuint/20070516elpepuint_10/Tes]]></link>
<description><![CDATA[El pequeño Bubba Ludwig, de 10 meses, recibió de su abuelo una herencia peculiar: una escopeta. Su padre, Howard, empezó a preocuparse por que su retoño no pudiera disfrutar pronto del regalo, así que solicitó para él una licencia de armas. No tenía muchas esperanzas de conseguirlo, pero rellenó la solicitud <i>on-line</i>, pagó los 5 dólares y el permiso fue suyo, según informa la web <i>BBC NEWS</i>.]]></description>
<guid isPermaLink="true"><![CDATA[http://www.elpais.com/articulo/internacional/bebe/licencia/armas/elpepuint/20070516elpepuint_10/Tes]]></guid>
<author><![CDATA[ELPAIS.com/AGENCIAS <[email protected]>]]></author>
<pubDate><![CDATA[Wed, 16 May 2007 18:28:00 +0200]]></pubDate>
</item>
<item>
<title><![CDATA[La PS3 y las baterías de litio lastran el crecimiento de Sony]]></title>
<link><![CDATA[http://www.elpais.com/articulo/internet/PS3/baterias/litio/lastran/crecimiento/Sony/elpeputec/20070516elpepunet_8/Tes]]></link>
<description><![CDATA[Los beneficios de Sony crecieron en 2006 menos de lo esperado. .]]></description>
<guid isPermaLink="true"><![CDATA[http://www.elpais.com/articulo/internet/PS3/baterias/litio/lastran/crecimiento/Sony/elpeputec/20070516elpepunet_8/Tes]]></guid>
<author><![CDATA[EFE / ELPAIS.com <[email protected]>]]></author>
<pubDate><![CDATA[Wed, 16 May 2007 18:26:00 +0200]]></pubDate>
</item>
</channel>
</rss>
Cuando lo converti a PHP lo unico que hice fue colocar todo en un ECHO
quedo asi:
Código PHP:
<?php
echo"<?xml version='1.0' encoding='iso-8859-1'?>
.
.
.
.
.
</channel>
</rss>";
?>
No entiendo por que al llamarlo con PHP no me lo detecta y por que al llamarlo con XML todo me lo devuelve bn No se si me puedan ayudar, ya estudie la biblioteca de AJAX... pero sigo sin poder encontrar el problema y es que para otro proyecto necesito que PHP se conecte a una BD para extraer datos y que JS pueda Parsearlos correctamente... Ayuda Plis...
si hace falta algun dato por favor avisarme...
asi mismo les agrego el HTML todo lo tengo en carpetas distintas...
Espero me puedan ayudar...
Código HTML:
<!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>RSS</title>
<script type="text/javascript" src="../js/prototype.js"></script>
<script type="text/javascript" src="../js/ajax.js"></script>
<script type="text/javascript" src="lector.js"></script>
<script type="text/javascript" src="../js/src/scriptaculous.js?load=effects"></script>
<link href="rss.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="divTitulo"></div>
<input type="button" value="Actualizar" id="btnActualizar" />
<div id="divContenedor">
<div id="divItems"></div>
<div id="divDetalle">
<div id="lblTituloItem"></div>
<div id="lblTextoItem"></div>
<div id="lblFechaItem"></div>
<div id="lblLinkItem"></div>
</div>
</div>
<div id="divLoading" style="display: none">Por Favor Espere...</div>
</body>
</html>
EDITE UN POCO EL XML, ya que tenia muchos caracteres....
Help