Microformatos, noticias

Los microformatos se emplean para añadir información adicional dentro de un documento html o xhmtl. Existen multitud de microformatos y se emplean para muy diferentes tipos de información, como por ejemplo: definir eventos de calendario hCalendar, tarjetas de presentación de personas, compañias, lugares y organizaciones hCard o para indicar el tipo de licencia que aplica a determinado contenido rel=”license”.

En este pequeño artículo hablaremos del microformato para noticias, hNews. Este microformato esta en estado de borrador, lo que significa que podría no ser definitivo y sufrir cambios. Con este microformato para noticias podemos especificar la siguiente información:

Organización fuente de la noticia (source-org, Source organization), en hCard (otro microformato)
El lugar donde la noticia tiene lugar (dateline, empleando texto a microformato hCard)
Coordenadas geográficas donde situar la noticia (empleando microformato geo)
La licencia de la noticia (license, empleando Licensing que ni si quiera esta en estado de borrador)
Principios (y ética) empleados por la organización que produce esta historia (principles, empleando microformato rel-principles)

Además hNews debe ser codificado como una hentry de hAtom. Realmente ya veremos que sólo hNews, hentry y source-org son los campos obligatorios. Para aclarar esto hAtom es un microformato que se emplea para especificar posts dentro de un blog o de una manera más genérica en cualquier sitio donde se pueda emplear el formato Atom de sindicación. El formato hAtom (que también está en estado borrador como hNews) incluye los siguientes elementos:

hfeed
feed-category
hentry
entry-title \*
entry-content
entry-summary
updated \*
published
author \*
bookmark
tags

El significado de cada elemento es análogo al que tiene el formato de sindicación Atom. Recordad que en hNews sólo se debe codificar hentry, ni hfeed ni feed-category tienen sentido aquí. Además dentro de hentry sólo es obligatorio, además de él mismo, los que aparecen en la lista de arriba marcados con un asterisco (entry-title, updated y author).

La organización fuente de la noticia debe ser codificada como hcard. hcard tiene muchos campos posibles para definir una persona, una compañía o un evento. Pero el único realmente obligatorio es fn

Veamos un ejemplo de noticia en microformato:

<div class="hNews">
  <div class="hentry">
    <h1 class="entry-title">Volcán continúa arrojando ceniza y obstaculiza vuelos</h1>
    <abbr class="updated" title="2010-04-18T23:00:00+01:00">18-04-2010 23:00</abbr> por <strong class="author">Fulanito</strong>,
    <span class="source-org vcard"><a class="url org fn" 
        href="http://espanol.news.yahoo.com/">Yahoo news España</a></span>
    <div class="entry-content>
      <p>La agencia europea de seguridad aérea Eurocontrol dijo que habrá unos 5.000 vuelos el sábado, siendo la cifra normal de 22.000…</p>
    </div>
  </div>
</div>

En el aparecen reflejados todos los campos obligatorios en el microformato hNews a saber: hNwes, hentry, (enty-title, updated y author obligatorios para hentry) y source-org (vcard y fn obligatorios de hCard para especificar source-org).

Analizar XML con Java

Aunque el formato de datos XML alardea de características como: extensibilidad, legibilidad, jerarquización, estandarización y capacidad de adaptación a multitud de formatos. A la hora de analizarlo y extraer información de él es, computacionalmente, un formato que presenta algunas dificultades con respecto a otros. Si bien es verdad que existen librerías/APIs dedicadas a superar este pequeño handicap. A continuación veremos ejemplos de dos tipos de librerías para analizar un documente XML desde java. Uno de ellos es el DOM (Document Object Model) y otro es el SAX (Simple API from XML).

Las diferencias principales entre DOM y SAX es que DOM genera un arból de objetos con sus dependencias en memoria. Esto permite acceder a cualquier elemento en cualquier posición una y otra vez, atrás y adelante sin problemas. El problema es que consume mucha memoria y no sería una opción recomendable para XMLs muy grandes. SAX por otro lado no almacena información en memoria y lee el fichero secuencialmente hasta encontrar el elemento y la información que necesitas en un proceso en donde se registran métodos callback cada vez que se detecta determinados patrones en el documento (apertura de etiquetas XML por ejemplo). SAX podría manejar con mayor facilidad grandes ficheros XML pero sin la libertad del DOM.

Veamos como podemos analizar este fragmento de XML


<?xml version="1.0" encoding="UTF-8"?>
<personas>
 <persona sexo="masculino">
  <nombre>Pepe</nombre>
  <apellidos>Gracia Perez</apellidos>
 </persona>
 <persona sexo="femenino">
  <nombre>María</nombre>
  <apellidos>Suarez Martinez</apellidos>
 </persona>
</personas>

Primero hay que crear un objeto Document (org.w3c.dom.Document) empleando otros dos objetos DocumentBuilder (javax.xml.parsers.DocumentBuilder) y DocumentBuilderFactory (javax.xml.parsers.DocumentBuilderFactory). Si por ejemplo el fichero que contiene nuestro xml se llama test.xml

Podríamos poner para cargar el dom el siguiente fragmento de código

(Dejando los namespaces completos)


org.w3c.dom.Document dom;
javax.xml.parsers.DocumentBuilderFactory dbf;
javax.xml.parsers.DocumentBuilder db;

dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();

try
{
  db = dbf.newDocumentBuilder();
  dom = db.parse("test.xml");
}
catch(Exception ex) {}

Ahora dom contiene toda la información y estructura de nuestro documento en memoria. Veamos como extraer la información que necesitamos

Para obtener el nodo raiz, en este caso personas, llamamos a:


org.w3c.dom.Element rootElement = dom.getDocumentElement();

rootElement es el objeto que ahora debemos interrogar. Por ejemplo si llamamos al método getElementsByTagName(String etiqueta) obtendremos un objeto de tipo NodeList (org.w3c.dom.NodeList) que contiene a su vez todos los posibles elementos incluidos dentro de la etiqueta. Para obtener por ejemplo el contenido de las etiquetas persona podríamos hacer


org.w3c.dom.NodeList nodeList = rootElement.getElementsByTagName("persona");

Para iterar sobre nodeList podriamos hacer


if(nodeList != null && nodeList.getLength()>0
{
  for(int i=0;i<nodeList.getLength();i++)
  {
    org.w3c.dom.Element element = (Element)nodeList.item(i);
    if(element.hasAttribute("sexo")) System.out.println(element.getAttribute("sexo"));
    org.w3c.dom.NodeList nodeList2 = element.getElementsByTagName("nombre");
    if(nodeList2 != null && nodeList2.getLength()>0
    {
      org.w3c.dom.Element el = (Element)nodeList2.item(0);
      System.out.println("Nombre: " + el.getFirstChild().getNodeValue());
    }
  }
}

Importante saber los métodos de nodeList:

– getLength() devolviendo el tamaño de la lista de nodos
– item(i) devuelve el nodo (objeto Node) de índice i

Y los métodos de Element

– getElementsByTagName(String nombreTag) devolviendo un NodeList
– getFirstChild() primer elemento inferior del nodo
– getAttribute(String atributo) valor del atributo
– hasAttribute(String atributo) si el nodo tiene o no este atributo

¿Garzón a juicio?

Hola Abraham

Tras las últimas noticias al respecto, te enviamos este mensaje para informarte de la postura de Amnistía Internacional ante la acusación al Juez Baltasar Garzón por investigar los crímenes franquistas.

Amnistía Internacional considera insólito que el juez Garzón pueda ser juzgado por investigar las desapariciones de más de 100.000 personas ocurridas durante la Guerra Civil y la dictadura franquista.

La “Ley de Amnistía de 1977” ha sido invocada para perseguir al único juez que ha intentado dar respuesta a víctimas de desaparición forzada y sus familias. Si este juicio se produce, será la primera vez en todo el mundo – al menos que tengamos constancia en Amnistía Internacional – que un magistrado, en democracia, es sentado en el banquillo por intentar conseguir verdad, justicia y reparación para las víctimas de crímenes internacionales. Además, enviará un mensaje tremendamente negativo para otros jueces que lo intenten, tanto en España, como en el resto del mundo.

Las normas internacionales de derechos humanos dicen claramente que el crimen de desaparición forzada NO prescribe y entorpecer su investigación es un delito, por tanto ninguna “Ley de Amnistía” puede contradecirlas.

Te animamos a que entres en nuestra página de facebook, dejes tus comentarios en el muro y compartas en tu perfil esta noticia.

Por favor, reenvía este mensaje a todos tus contactos.

Recibe un cordial saludo,

Esteban Beltrán
Director Amnistía Internacional

Wikileaks revela más datos sobre operaciones de EEUU en Irak

Posiblemente la inmensa mayoría de las atrocidades de la guerra de Irak (y de todas las guerras) permanezcan en el anonimato. De vez en cuando algunas de ellas salen a la luz y este pequeño artículo habla de una de ellas. Simplemente para que lo que pasó aquí sea más conocido. Nuevamente a wikileaks ha llegado este importante documento (un vídeo de una operación militar grabado desde un helicóptero) que han hecho inmediatamente público. Wikileaks permite que la gente envíe anonimamente documentos comprometedores para grandes empresas, gobiernos u otros agentes especialmente poderosos y que ellos hacen públicos. El anonimato de la fuente original está garantizado por ellos.

Bueno, no me quiero enrollar más. La historia y el vídeo lo podéis ver en collateralmurder.org/. A grandes pinceladas un ataque americano en Iraq causa muertos y heridos entre hombres y niños en un pequeño barrio marginal en la ciudad de Nueva Bagdad. Antes de sacar el vídeo la versión oficial del ejercito y del gobierno americano era de operaciones de combate contra insurgentes. El vídeo ha salido a la opinión pública hoy mismo 5 de abril del 2010, como ellos mismos comentan.

Pongo abajo el vídeo de youtube pero aconsejo que leáis la versión de wikileaks de todo el incidente. AVISO ANTES DE QUE LE DEIS AL PLAY: El vídeo contiene imágenes que pueden herir la sensibilidad si eres menor de edad no lo veas.

Convertir String a int en Java y viceversa

A continuación unas pequeñas recetas de java para pasar de cadena a entero o de entero a cadena.

Para convertir un String (cadena) a int (entero) hay que emplear el método estático de la clase Integer, parseInt

Ejemplo:


String enteroString = "5";
int entero = Integer.parseInt(enteroString);

Para convertir int(entero) a String sólo debemos hacer una llamada al método estático de la clase Integer, toString

Ejemplo:


int entero = 1;
String enteroString = Integer.toString(entero);

Análogamente para pasar de cadena a double tenemos el método Double.parseDouble

Ejemplo:


double aDouble = Double.parseDouble(aString);

o al revés (double a string) llamamos al método Double.toString

Ejemplo:


double d = 8342342;
System.out.println(Double.toString(d));

Tanto la clase Integer con la clase Double se encuentran en el package java.lang. Atención int y double son tipos primitivos del lenguaje java. Integer y Double son clases que representan estos tipos primitivos y le añaden más funcionalidades. Como por ejemplo las que acabamos de ver.