Tratar XML con JavaScript Core

23 03 2009

Recientemente preguntaron en el maillist de javascript en español “ JavaEScript” sobre los ejemplos de W3Schools. El problema es que se quería insertar en una array el title, author, year y price de cada elemento book para posteriormente ordenarlos en una tabla. Al parecer estaban teniendo problema con que al leer el fichero no sabían discriminar los nodos que tiene. Los ejemplos de W3Schools utilizan la implementación DOM que viene en javascript por defecto en (casi) cualquier navegador moderno, el cuál no es precisamente fácil de utilizar y/o entender.
El XML en cuestión es el siguiente:

<bookstore><book category="cooking"> 
    <title lang="en">Everyday Italian</title> 
    <author>Giada De Laurentiis</author> 
    <year>2005</year> 
    <price>30.00</price> 
  </book> 
  <book category="children"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
  </book> 
  <book category="web"> 
    <title lang="en">XQuery Kick Start</title> 
    <author>James McGovern</author> 
    <author>Per Bothner</author> 
    <author>Kurt Cagle</author> 
    <author>James Linn</author> 
    <author>Vaidyanathan Nagarajan</author> 
    <year>2003</year> 
    <price>49.99</price> 
  </book> 
  <book category="web" cover="paperback"> 
    <title lang="en">Learning XML</title> 
    <author>Erik T. Ray</author> 
    <year>2003</year> 
    <price>39.95</price> 
  </book> 
</bookstore>

Modifique el ejemplo de http://www.w3schools.com/dom/tryit.asp?filename=try_dom_list_loop, para utilizar el DOM core sin ninguna librería que facilitara el trabajo y a la vez usar código que entendiera la persona que hizo la pregunta, para hacer lo que se pedía:

<html>
 <head>
  <script type="text/javascript" src="loadxmldoc.js"></script>
 </head>
 <body>
 <script type="text/javascript">
   var arrayExterior = new Array();
   xmlDoc=loadXMLDoc("books.xml");
   x=xmlDoc.getElementsByTagName("book");
   for (i=0;i<x.length;i++)
   {
    var arrayInterior = new Array();
    for (j=0;j<x[i].childNodes.length;j++)
    {
    if (x[i].childNodes[j].nodeType==1)
    {
       var textValue = x[i].childNodes[j].childNodes[0].nodeValue;
       arrayInterior.push(textValue);
     }
   }
  arrayExterior.push(arrayInterior);
  }
 document.write("Total elementos: "+arrayExterior.length+"<br/>")
 for (i=0; i<arrayExterior.length; i++) {
  document.write("book "+i+"<br/>");
  for (j=0; j<arrayInterior.length; j++) {
    document.write(arrayExterior[i][j]+"<br/>");
  }
  document.write("<hr/>");
 }
</script>
</body>
</html>

El punto a destacar es que los nodos como book tienen un nodo implícito tipo text “invisible”, es decir, entre book y title existe un nodo text que no tienen ningún valor, algo similar a esto :

 <book category="children">
  <text-node/>
 <title lang="en">Harry Potter</title>

por eso lo mas fácil es un bucle que recorra los childNodes y preguntar el nodeType (1=Element, 3=Text, la lista completa aqui: http://www.w3schools.com/Dom/dom_nodetype.asp).





Aumentando SCMS

31 07 2006

SCMS (Semantic CMS) se basa en una premisa fundamental: Cada Esquema de Contenido (Tipo de Contenido) se refiere a un área de conocimiento especifico. Es decir, nuestra base de conocimiento sera la suma de cada dominio específico del CMS. Las búsquedas inteligentes son, en principio, únicamente para los dominios del SCMS. Dicho eso, podemos ampliar dicho conocimiento, es decir expander cada dominio de forma semi-automática mediante el uso de agentes inteligentes. La idea es tener agentes que busquen en sitios conocidos para ampliar la información que se ha agregado al CMS y que automaticamente agregue anotaciones semánticas sobre dicha información.

Ah si, adjunto un esquemita:

Gestor de Contenidos Semántico





CMS Semantico

14 07 2006

Ayer comence un nuevo proyecto: Construir un Gestor de Contenidos Semántico la idea me venia dando vueltas desde hace ya un tiempo asi que comence ayer. Hoy me he decidido que hay varias propuestas de lo mismo pero nada claro. Esto es lo que estoy utilizando:

Ingredientes:

  1. Un framework en Java para crear CMSs: Lenya
  2. Un framework en Java para la Web Semántica (crear ontologias y un motor de inferencia): Jena
  3.  Uno o varios Agentes Inteligentes: No me he decidido si me lo creo personalizado o utilizo un API como el de Agglets.

Concepto:
Lenya provee los modulos necesarios para la gestión de contenidos (autenticación, publicación, edición, gestion de permisos, etc.). Para búsqueda Lenya (y todos los demás) utiliza un agente de búsqueda en seste caso Lucene. Sin embargo, dichos agentes de búsqueda no hacen sino una categorización binaria, para la Web Semántica (Web 2.0) necesitamos crear Ontologias, al tratarse de un CMS, los dominios de conocimiento para tales ontologias serán las páginas del sitio Web creadas y editadas. Por tanto no es necesario, tener un agente inteligente que navegue por toda la Web, pero no estaria mal que el agente aumente el conocimiento del Sitio a traves de la Web. Si es necesario en cambio, un agente construya una Base de Conocimiento a partir de dichas ontologías. Por último, se necesita de un Motor de Inferencia que nos permita realizar consultas en lenguaje natural y que el sistema interprete la consulta y nos devuelva respuestas válidas. (Para más información sobre este tema referirse a Wikipedia 3.0: El fin de Google).

Para armar dicha base de Conocimiento (y por tanto las ontologías) utilizaré OWL que es, básicamente, un lenguaje XML para Ontologías. Dado que la base de conocimiento esta en XML, resulta muy conveniente que el conocimiento (contenido del sitio Web) esté tambien en XML, de aqui que Lenya sea mi elección ya que guarda todo el contenido en XML y no en esquemas propietarios de bases de datos. Jena provee un API de OWL para Java así como tambien un motor para SPARQL. Lenya debe ser capaz de comunicarse bastante bien con Jena ya que tambien es un API Java y al basarse en Cocoon, permite hacer todo tipo de transformaciones XSLT, de forma que todas las piezas encajan perfectamente.

La integración de todo el sistema es básicamente remplazar las búsquedas de Lucene por consultas de SAPRQL a la Base de Conocimiento creada por un agente a partir de las ontologias formadas sobre cada página del sitio.

Ire informando del avance de este proyecto.