apuntex_alexbm8_30_03_09

Apuntes del 30 de Marzo
Comenzamos la clase con el resumen de afharo y vallesquino. A continuación, alexbm8 comentó su ejercicio T2.4, así como [|pakitochus] el suyo.

Seguimos con el temario: **PROCESANDO XML**

Cuando creamos un documento XML, es para hacer algo como él, ya que XML es un formato de manejo de información. Para ello, necesitamos disponer un XML bien formado (INFOSET) que nos permitirá obtener un árbol que será interpretado por cualquier lenguaje de programación. Normalmente los lenguajes incluyen librerías para tratar XML. Ruby usa [|rexml], que viene incluida en el paquete principal del mismo y no hay que descargarla. Vimos el siguiente [|ejemplo]: code format="ruby" require 'rexml/document' include REXML documento = ARGV[0] file = File.new(documento) doc = Document.new(file) puts doc code Con "//require//" cargamos una librería externa Después le decimos que incluya en el espacio de nombres local todos los identificadores de la librería. (Nota: Las variables no usan caracteres especiales.) // ARGV[0] // es el argumento que se le pasa por línea de comandos. Con //File.new// cargamos el fichero y lo introduce en "//file//" // Document // es una clase que pertenece a //rexml//, carga el fichero como una estructura propia de ruby en //doc//. Mostramos el contenido del fichero con //puts//.

A continuación vimos este segundo ejemplo ([|muebles-2.rb]): code format="ruby" require 'rexml/document' include REXML documento = ARGV[0] file = File.new(documento) doc = Document.new(file) doc.root.each_element('habitacion') { |habitacion| habitacion.each_element('mueble') { |mueble| puts mueble.text } } code En él, recorremos todos los elementos a partir de //doc.root// que se llaman habitación. En ruby todas las operaciones van a estar muy orientadas a la programación con objetos, por eso no usamos bucles //for//. En habitación estarán cada uno de esos elementos. Después para cada habitación recorremos cada uno de los muebles y los almacenamos en la variable de igual nombre. // puts habitacion.element("tipo")=> // para acceder a un tipo determinado JJ probó a introducir dentro de un mueble otra habitación, y vimos que no lo mostraba por pantalla.

Despues vimos el ejemplo en [|Perl] y lo depuramos en clase: code format="perl" use XML::Simple; my $documento = $ARGV[0]; my $muebles = XMLin($documento); for my $h ( @{$muebles->{habitacion}->{mueble}} ) { print "$h\n"; } code Con //XMLin// convertimos el documento XML es un hash de hashes Con //@// convertimos la referencia a un array en un array, y con //h// vamos recorriendo dicho array. Cada nodo del árbol XML se convierte en una variable asociativa con su clave concreta. Para derreferenciar un hash usamos %(valores asociativos), y para derreferenciar el array usamos @. El $ es para variables escalares, sin referencia: //"$h ( @{$muebles->{habitacion}->{mueble}}"//

Después vimos el bloque T2.5, el cual, en el apartado 1, se podría hacer en ruby o en perl. Vallesquino lo hizo en ruby, y dejamos el resto de lenguajes como ejercicio para el viernes.


 * FORMATOS XML ESPECÍFICOS **

El más célebre es el [|RSS], que básicamente es como un DTD ya definido (XML restringido). Existen diferentes versiones, siendo la más popular la 2.0. Ésta posee una serie de descriptores generales de todo el sitio. En un RSS se pueden tener diferentes canales, aunque en la práctica suelen tener sólo uno. La fecha de publicación es importante. El // // es un URL único. Muchas veces aparecen todos los títulos en la parte superior, y ya debajo aparecen las descripciones. RSS es un formato muy habitual, y para trabajar con él, como sabemos su estructura, existen librerías específicas. [|Atom] es otro formato con éxito en blogspot, y además de servir para bajar noticias se puede utilizar para publicarlas. Se denominan formatos de [|sindicación]. Existen programas específicos para leer estos formatos (las últimas versiones de Firefox ya la incluyen).

Vimos el ejemplo en Ruby code format="ruby" require 'rexml/document' include REXML documento = ARGV[0] file = File.new(documento) doc = Document.new(file) doc.root.elements['channel'].each_element('item') { |item| puts "*"+item.elements['title'].text }

code Básicamente lo que hacemos es recorrer cada item y obtenemos el título, recorriendo el elemento y el canal.

Otra forma es usar la librería específica de RSS: code format="ruby" require 'rss/1.0' require 'rss/2.0' documento = ARGV[0] file = File.new(documento) rss = RSS::Parser.parse(file, false) rss.channel.items.each do |i| puts "*" + i.title end code Cargamos las dos librerías de las dos versiones de RSS, y usamos el //parser// para verificar que tiene la estructura de documento RSS bien formado. Para ejecutarlo: //./res-1.rb [fichero.rss]// El ejemplo es bastante parecido, pero nos ahorramos algo de escritura. Después vimos el Bloque T2.6 y T2.7