Este método recibe un objeto con distintas propiedades que representan sus opciones. Estas propiedades son:
WinJS.xhr({ url: "http://www.desarrolloweb.com/rss/general_rss.php" })
.done(processPosts, processError, showProgress);
En el método processPost recibiríamos el resultado una vez la función se hubiera completado con éxito. Este resultado contendrá una propiedad responseXML de tipo DomParser del que podríamos extraer los resultados de la llamada en formato XML.
En cualquier caso, la mejor forma de verlo es ponerlo en práctica. Vamos a modificar el proyecto creado con la plantilla de Grid que hemos estado utilizando en los anteriores artículos de este manual.
En este fichero lo primero que vamos a borrar es todo el código que viene por defecto y que no vamos a utilizar. Los elementos que tenemos que eliminar son:
Eliminados estos datos, lo siguiente es definir las variables que vamos a utilizar para recuperar la información. En el siguiente fragmento podemos verlas:
// Blog que vamos a consultar
var blog = {
key: "DesarrolloWeb.com - General",
url: 'http://www.desarrolloweb.com/rss/general_rss.php',
title: 'tbd',
updated: 'tbd'
};
El objeto blog contendrá todos los datos que necesitamos para hacer la operación, incluida una referencia a una función acquirerSyndication que definiremos a continuación. En cuanto a las funciones que vamos a necesitar, la primera en definir será acquirerSyndication.
function acquireSyndication(url) {
// Invoca una URL y devuelve el promise
return WinJS.xhr({ url: url });
}
Esta función simplemente va a recibir una URL y va a utilizar WinJS.xhr para realizar una llamada a la misma, devolviendo el promise resultante.
Esta función tendremos que llamarla desde alguna otra. En este caso dicha función será getBlogPosts y se encargará de obtener los posts de un blog recibido como parámetro.
function getBlogPosts(blog) {
// Obtiene los posts de un blog pasado como parametro
var blogPosts = new WinJS.Binding.List();
acquireSyndication(blog.url).then(function (articlesResponse) {
var articleSyndication = articlesResponse.responseXML;
// Calcular titulo y la fecha de ultima publicacion
blog.title = articleSyndication.querySelector("rss > channel > title").textContent;
var published = articleSyndication.querySelector("rss > channel > item > pubDate").textContent;
blog.updated = formatLastModifiedDate(published);
// Procesar los items del canal RSS
getItemsFromXml(articleSyndication, blogPosts, blog);
});
return blogPosts;
}
La función realiza tres pasos sencillos:
function formatLastModifiedDate(lastUpdate) {
// Convierte la fecha al formato en que queremos mostrarla
var date = new Date(lastUpdate);
var dateFmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(
"month.abbreviated day year.full");
var blogDate = dateFmt.format(date);
return "Last updated " + blogDate;
}
Como vemos, WinRT nos va a ofrecer clases y métodos para poder realizar estas transformaciones de forma sencilla, simplemente pasándoles las máscaras deseadas. La última función que necesitamos definir es getItemsFromXml, que nos permitirá obtener la información concreta de los posts.
function getItemsFromXml(articleSyndication, blogPosts, feed) {
// Obtener todos los posts del blog
var posts = articleSyndication.querySelectorAll("item");
for (var postIndex = 0; postIndex < posts.length; postIndex++) {
var post = posts[postIndex];
// Obtener datos de cada post: titulo, fecha, descripcion y link
var postTitle = post.querySelector("title").textContent;
var postPublished = post.querySelector("pubDate").textContent;
var description = post.querySelector("description").textContent;
var link = post.querySelector("link").textContent;
// Guardar en la lista enlazada de posts
blogPosts.push({
group: feed,
key: feed.title,
title: postTitle,
published: postPublished,
link: link,
description: description
});
}
}
Como en el método anterior, tenemos tres pasos fundamentalmente:
var list = new WinJS.Binding.List();
var groupedItems = list.createGrouped(
function groupKeySelector(item) { return item.group.key; },
function groupDataSelector(item) { return item.group; }
);
// TODO: Replace the data with your real data.
// You can add data from asynchronous sources whenever it becomes available.
sampleItems.forEach(function (item) {
list.push(item);
});
Ese código será remplazado por este otro:
var list = getBlogPosts(blog);
var groupedItems = list.createGrouped(
function groupKeySelector(item) { return item.group.key; },
function groupDataSelector(item) { return item.group; }
);
En él simplemente estamos llamando al método getBlogPosts, que ya nos devuelve la lista preparada para utilizarla. La llamada al método la hacemos a partir de la información que definimos al principio del artículo en la variable blog.
Sólo nos queda ejecutar la aplicación y ver los resultados. Deberían ser parecidos a lo que podemos ver en la siguiente imagen:

La buena noticia es que estamos recuperando la información, puesto que el grid mostrará la lista de elementos que realmente define el canal RSS. La mala es que el resultado, desde un punto de vista estético, es francamente poco agradable. Pero esto tiene fácil solución, y pasa por Blend for Visual Studio.
En próximos artículos veremos cómo podemos mejorar el aspecto de la aplicación de forma sencilla utilizando Blend para realizar su diseño gráfico.