Simple parser para feed de WordPress

Seis hábitos que puedes encontrar en los programadores
14 abril, 2014
Desactivar un item en un DropBox Android
21 abril, 2014

wpand Me consultaron sobre como hago y que utilizo para leer los feed de WordPress.

Es parte de este Blog colaborar con la comunidad de desarrolladores a medida que se pueda por los que les detallo que es lo que hice.

Este en particular lo desarrollé para el feed que tiene el WordPress, pero les puedo asegurar que se puede adaptar fácilmente a cualquier otro feed considerando que sea XML los datos que se obtienen.

Si tu WordPress tiene el feed activado basta con colocar en la URL la palabra feed, por ejemplo http://www.biottux.com.ar/feed . Esta URL les va a mostrar el XML del feed de mi Blog.

El Parser que implementé es el siguiente

	public ArrayList<BOXPostModel> parse() {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		ArrayList<BOXPostModel> entries = new ArrayList<BOXPostModel>();
		BOXPostModel entry;
		try {
			URL url = new URL("http://biottux.com.ar/feed");
			DocumentBuilder builder = factory.newDocumentBuilder();
			URLConnection con = url.openConnection();
			con.setConnectTimeout(15000);
			Document dom = builder.parse(con.getInputStream());
			
			Element root = dom.getDocumentElement();
			NodeList items = root.getElementsByTagName("item");
			for (int i=0;i<items.getLength();i++){
				entry = new BOXPostModel();				
				Node item = items.item(i);
				NodeList properties = item.getChildNodes();
				for (int j=0;j<properties.getLength();j++){
					Node property = properties.item(j);
					String name = property.getNodeName();
					if (name.equalsIgnoreCase("title")){
						entry.sTitle = property.getFirstChild().getNodeValue();
					} else if (name.equalsIgnoreCase("guid")){
						entry.sID = property.getFirstChild().getNodeValue();
					} else if (name.equalsIgnoreCase("link")){
						entry.sLink =  property.getFirstChild().getNodeValue();
					} else if (name.equalsIgnoreCase("description")){
						entry.sDescription = property.getFirstChild().getNodeValue();
					} else if ( name.equalsIgnoreCase("pubDate")){
						entry.sDate =  this.getCorrectDate(property.getFirstChild().getNodeValue());
					} else if ( name.equalsIgnoreCase("content:encoded")){
						entry.sContent = property.getFirstChild().getNodeValue();
						String sC = entry.sContent;
						Pattern p = Pattern.compile(".*<img[^>]*src=\"([^\"]*)");
						Matcher m = p.matcher(sC);
						
						if( m.find()){
							entry.sImage = m.group(1);
						}
					}
				}
				entries.add(entry);
			}
		} catch (Exception e) {
			entry = new BOXPostModel();				
			entry.sID = "-666";
			entry.sTitle = "No se encuentran datos";
			entry.sDescription = "Description";
			entry.sDate = "12349";
			entries.add(entry);
		} 
		return entries;
	}	

Como verán los datos los almaceno en un ArrayList de una clase modelo con los datos del feed que utilizo luego.

Como para que les quede también a ustedes se las dejo:

import java.io.Serializable;

public class BOXPostModel implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 249889690L;
	public String sID;
	public String sTitle;
	public String sDescription;
	public String sLink;
	public String sDate;
	public String sContent;
	public String sImage;
	
	public BOXPostModel(){
		sID = "";
		sTitle = "";
		sDescription = "";
		sLink = "";
		sDate = "";
		sContent = "";
		sImage = "";
	}
	
}

Por último les queda hacer uso del método para obtener una lista con los datos que van a usar, con lo que solo tienen que pensar en donde lo van a implementar, ya sea un ListView, una Table, o lo que les resulte útil.

ArrayList<BOXPostModel> datos = parse();

Como siempre digo, espero les sea útil y cualquier cosa comenten o pregunten.

Deja un comentario