jueves, 7 de mayo de 2009

AAP Practica 5: Manejo de XML

Código ruby del cgi en el servidor:




#!/usr/bin/ruby

require 'cgi'
require 'rss/1.0'
require 'rss/2.0'
require 'open-uri'
require 'rexml/document'

cgi = CGI.new
puts cgi.header
puts "<html><head><title>Agregador RSS</title><link href='estilo.css' rel='stylesheet' type='text/css'></head><body> <br>"

#Obtenemos las fuentes del url
fuentes=cgi.params['fuenteRSS']

codigo = "<br>"
#Para cada fuente extraemos el xml (rss) que lleva
fuentes.each do |feed|
content = ""
open(feed) do |s| content = s.read end
rss = RSS::Parser.parse(content, false)

#y mostramos tanto el título del canal como el propio url del feed
codigo += "<h1> Canal: " + rss.channel.title + "</h1><br>"
codigo += "<h2> Feed: " + feed + "</h2><br>"

#Y para cada noticia (item) del canal extraemos el link con su título y la fecha
rss.channel.items.each do |item|
codigo += "<a href=" + item.link + ">" + item.title + "</a> <br>"
codigo += "Fecha de publicaci&oacute;n: " + item.pubDate.strftime("%d/%m/%Y a las %H:%M h") + "<br><br>"
end

end
#Mostramos todo el código
puts codigo

#Finalizamos la página HTML
puts "</body></html>"




Código html para pedir los feeds del rss:

<html>
<head>

</head>
<body>
<div id='resultado' style='border:solid;background:lightblue;padding:30px'>

<h1><b><i>Feeds RSS:</i></b></h1><p>

<FORM name=formulario"" ACTION="http://swecai.ugr.es/~tularis/P5/rss.cgi">

Fuente RSS 1: <INPUT name="fuenteRSS" size="50" value="http://rss.marca.com/rss/descarga.htm?data2=429"><BR>
Fuente RSS 2: <INPUT name="fuenteRSS" size="50" value="http://rss.marca.com/rss/descarga.htm?data2=428"><BR>
Fuente RSS 3: <INPUT name="fuenteRSS" size="50" value="http://rss.marca.com/rss/descarga.htm?data2=445"><BR>
Fuente RSS 4: <INPUT name="fuenteRSS" size="50" value="http://rss.marca.com/rss/descarga.htm?data2=447"><BR>
Fuente RSS 5: <INPUT name="fuenteRSS" size="50" value="http://rss.marca.com/rss/descarga.htm?data2=443"><BR>

<p><div id="botonSubmit" style='padding-left:50px'><INPUT TYPE=SUBMIT VALUE="Submit"></div</p>
</FORM>

</body>
</html>

Se puede probar aquí: probarla

martes, 5 de mayo de 2009

AAP Bloque T2.3 Con los equipos de la liga anteriores, usar diferentes espacio de nombres para el equipo en sí y para sus componentes. Por ejemplo,...

Se han utilizado varios espacios de nombres para designar a un equipo de liga eq:, al cuerpo tecnico ct:, a los jugadores pl:, a la posición de juego po: y a los equipos de la liga el:

<?xml version="1.0" encoding="iso-8859-1"?>
<el:equiposLiga xmlns='http://www.geneaura.org/' xmlns:el='http://www.geneaura.org/equiposLiga' xmlns:eq='http://www.geneaura.org/equipo' xmlns:pl='http://www.geneaura.org/jugadores' xmlns:po='http://www.geneaura.org/posiciones' xmlns:ct='http://www.geneaura.org/cuerpoTecnico' name="graná">
<eq:equipo id="Grana">
<eq:nombre>Grana</eq:nombre>
<ct:entrenador>Jose</ct:entrenador>
<ct:auxiliar>Joaquín</ct:auxiliar>
<po:defensa>
<pl:jugador>Juan</pl:jugador>
<pl:jugador>Pedro</pl:jugador>
<pl:jugador>Lucas</pl:jugador>
<pl:jugador>Javi</pl:jugador>
</po:defensa>
<po:centrocampista>
<pl:jugador>Alfredo</pl:jugador>
<pl:jugador>Francisco</pl:jugador>
<pl:jugador>Luis</pl:jugador>
<pl:jugador>Sergio</pl:jugador>
</po:centrocampista>
<po:delantero>
<pl:jugador>Andres</pl:jugador>
<pl:jugador>Santiago</pl:jugador>
<pl:jugador>Jorge</pl:jugador>
<pl:jugador>Julian</pl:jugador>
</po:delantero>

</eq:equipo>
</el:equiposLiga>


AAP Bloque T2.2.2: Crear un documento XML que describa varios libros de una biblioteca o librería, con título, autores, resumen, editorial y los ...

Documento XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<libreria>
<libro isdn="4234809541">
<nombre>El caballero errante</nombre>
<autor>JRR Martin</autor>
<editorial>Gigamesh</editorial>
<ambientacion>Medieval/Fantastica</ambientacion>
</libro>
<libro isdn="45287656">
<nombre>Señores de las runas</nombre>
<autor>David Farland</autor>
<editorial>Factoria de ideas</editorial>
<ambientacion>Medieval/Fantastica</ambientacion>
</libro>
<libro isdn="4234534">
<nombre>El señor de los anillos</nombre>
<autor>JRR Tolkien</autor>
<editorial>Minotauro</editorial>
<ambientacion>Medieval/Fantastica</ambientacion>
</libro>
</libreria>

AAP Bloque T2.10: Hacer un filtro SAX que traduzca el célebre XML casero de etiquetas en español a etiquetas en inglés. Hacerlo en Ruby o en otro leng

Fichero xml utilizado:

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Descripción de los elementos de una casa soñada -->
<micasa>
<habitacion id="comedor">
<mueble>aparador</mueble>
<mueble>sofa</mueble>
</habitacion>
<habitacion id="cocina">
<mueble>lavaplatos</mueble>
<mueble>fregadero</mueble>
</habitacion>

</micasa>


Código ruby utilizado:

#!c:\ruby\bin\ruby.exe
require 'rexml/document'
require 'rexml/streamlistener'
require 'cgi'
include REXML

file=ARGV[0]

diccionario = {"micasa"=>"myHouse",
"habitacion"=>"room",
"mueble"=>"furniture",
}

class Traduce

include StreamListener
def initialize(dic)
@escribe = false
@diccionario=dic
end

def tag_start(name, attributes)
puts "<"+@diccionario[name]+">"
if (name == "mueble")
@escribe = true
end
end

def tag_end(name)
puts "</"+@diccionario[name]+">"
@escribe=false
end

def text(text)
if @escribe
if @diccionario[text]
puts @diccionario[text]
else
puts text
end
end
end

end

print "Content-Type: application/xhtml+xml\n\n"

listener = Traduce.new(diccionario)
parser = Parsers::StreamParser.new(File.new(file), listener)
parser.parse


Resultado:


Content-Type: application/xhtml+xml

<myHouse>
<room>
<furniture>
aparador
</furniture>
<furniture>
sofa
</furniture>
</room>
<room>
<furniture>
lavaplatos
</furniture>
<furniture>
fregadero
</furniture>
</room>
</myHouse>

AAP Bloque t2.12.2:En un documento XML con la clasificación de los equipos de fútbol, imprimir sólo los que estén clasificados para liga de campeones

Se muestra el xml utilizado:

<?xml version="1.0" encoding='iso-8859-1' ?>
<liga>
<equipo id='barsa'>
<posicion>1</posicion>
</equipo>
<equipo id='atletico'>
<posicion>5</posicion>
</equipo>
<equipo id='malaga'>
<posicion>6</posicion>
</equipo>
<equipo id='betis'>
<posicion>10</posicion>
</equipo>
<equipo id='madrid'>
<posicion>2</posicion>
</equipo>
<equipo id='sevilla'>
<posicion>3</posicion>
</equipo>
<equipo id='Villareal'>
<posicion>4</posicion>
</equipo>
</liga>



Y ahora el código ruby que lo procesa para obtener los 4 primeros clasificados:


#!/usr/bin/ruby

require 'rexml/document'
include REXML
documento = ARGV[0]
file = File.new(documento)
doc = Document.new(file)
XPath.each(doc,"//equipo[posicion<=4]/@id") { |titulo|
puts titulo
}



El resultado es el siguiente:
barsa
madrid
sevilla
Villareal

que son los 4 primeros equipos clasificados

AAP bloqueT2.12 : Para los atributos en XPath se usa la expresión @atributo. Sabiéndolo, poner la expresión XPath que, en los XML de habitaciones ante

Aquí dejo el código xml que se utiliza:

<?xml version="1.0" encoding='iso-8859-1' ?>
<micasa>
<habitacion id='comedor'>
<mueble>aparador</mueble>
<mueble>sofá</mueble>
<puerta a='balcon' />
</habitacion>
<habitacion id='salon'>
<mueble>mesa</mueble>
<mueble>sofá</mueble>
</habitacion>
<habitacion id='baño'>
<mueble>mesa</mueble>
<mueble>sofá</mueble>
<puerta a='pasillo' />
</habitacion>
</micasa>

Y aquí el código en RUBY que lo procesa con xpath:

#!/usr/bin/ruby

require 'rexml/document'
include REXML
documento = ARGV[0]
file = File.new(documento)
doc = Document.new(file)
XPath.each(doc,"//habitacion[puerta[@a]]/@id") { |titulo|
puts titulo
}

El resultado es:

comedor
baño

Que son los id de las habitaciones que poseen una puerta con atributo 'a' .

viernes, 24 de abril de 2009

AAP: Bloque 2.8.3: Hacer un CGI que genere un RSS arbitrario. El tipo que hay que devolver es application/xml+rss.




bloque2.8.cgi



#!"C:\Program Files\XAMPP\perl\bin\perl.exe"


use CGI qw(:standard);

print header( -type => 'application/xml+rss' );

print<<EOC;
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">

<channel>
<title>Barcelona // Marca // marca.com</title>
<link>http://www.marca.com/</link>

<item>

<title><![CDATA[Iniesta pide que se reconozca la gran temporada del Barça]]></title>
<link>http://www.marca.com/2009/04/23/futbol/equipos/barcelona/1240491412.html</link>
<description><![CDATA[Andrés Iniesta reivindicó la reciente trayectoria de su equipo y pidió que se valoren &quot;los méritos&quot; del Barça como líder de la Liga, finalista de la Copa y semifinalista de la Liga de Campeones.&nbsp; <a href="http://www.marca.com/2009/04/23/futbol/equipos/barcelona/1240491412.html">Leer</a>]]></description>
<author><![CDATA[EFE <marca@recoletos.com>]]></author>
<guid isPermaLink="true">http://www.marca.com/2009/04/23/futbol/equipos/barcelona/1240491412.html</guid>
<pubDate>Fri, 24 Apr 2009 09:34 +0200</pubDate>
</item>

<item>
<title><![CDATA[El Barça jugará en julio dos amistosos en Wembley]]></title>
<link>http://www.marca.com/2009/04/23/futbol/equipos/barcelona/1240515304.html</link>
<description><![CDATA[El Barcelona trasladará en el próximo verano su concentración de verano a Londres, donde jugará dos partidos amistosos, en el estadio de Wembley, ante el Tottenham Hotspur inglés y el Al-Ahly egipcio.&nbsp; <a href="http://www.marca.com/2009/04/23/futbol/equipos/barcelona/1240515304.html">Leer</a>]]></description>
<author><![CDATA[EFE. Barcelona <marca@recoletos.com>]]></author>

<guid isPermaLink="true">http://www.marca.com/2009/04/23/futbol/equipos/barcelona/1240515304.html</guid>
<pubDate>Thu, 23 Apr 2009 21:41 +0200</pubDate>
</item>



</channel>
</rss>
EOC