Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

XML -> RSS

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Módulos
Mensaje Jue Jun 07, 2007 5:40 am
Linuxero
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Jun 2007
Mensajes: 4
XML -> RSS Responder citando

¡Hola a todos!

Estoy trabajando con documentos RSS y hago uso de la función parseRSS del modulo XML::RSSLite, así meto en un hash cada una de las partes del RSS (channel, item, description, etc.).

El problema está en que parseRSS se carga literalmente todos los caracteres acentuados, ñ, ç, además de cualquier tag HTML que pueda haber.

Una solución que he encontrado a este problema es usar la función encode_entities (del módulo HTML::Entities) para sustituir estos caracteres problemáticos por su código HTML correspondiente ( p.e. á sería á ), después ejecuto parseRSS y finalmente uso decode_entities para recuperar los caracteres originales (siguiendo con el ejemplo, á sería de nuevo á). Con todo este proceso parseRSS no elimina ningún carácter acentuado ni ñ, etc.

El problema que ocurre con todo esto es que encode_entities también modifica los tags xml del documento RSS (p.e. <channel> pasa a ser lt;channelgt;) y después cuando aplico parseRSS no reconoce el documento que le paso como un RSS, porque no es capaz de reconocer el "tag" lt;channelgt; (espera <channel>). La solución a este nuevo problema: después de encode_entities usar una función propia para restaurar los tags xml (con el ejemplo anterior, lt;channelgt; lo escribo correctamente, o sea <channel>), ahora sí puedo aplicar parseRSS con lo cual reconoce las etiquetas y finalmente uso decode_entities para recuperar los caracteres originales.

Resumiendo la cosa queda así:

Código:
encode_entities;
#sustituye los caracteres acentuados, ñ, etc. por su equivalente en HTML, pero también modifica los tags xml (problema con parseRSS)
restaura_tags_xml;
#función propia que restaura los tags xml de mi documento RSS
parse_rss;
#mete en un hash cada una de las partes del RSS
decode_entitites;
#lo contrario a encode_entitites, recupera los caracteres originales de los que están escritos en forma de código HTML


El asunto está en la función que restaura los tags xml: hay que tener en cuenta todos los tags de todos los formatos de documentos RSS (y atom también) para así poder restaurar todas las etiquetas que puedan aparecer. Y francamente, esto no queda muy elegante.

La pregunta es ¿no hay otra forma más sencilla de hacerlo?

Por ejemplo, desmontar el documento RSS en una estructura de árbol para cada uno de los tags y modificar solo el texto sin modificar los tags, y después recuperar el documento RSS original. El problema con esta idea es que no sé ni con qué módulo XML empezar ni qué funciones utilizar. Si alguien tuviera alguna idea, sería de muy muy agradecer.

Gracias.
Mensaje Jue Jun 07, 2007 7:48 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Bienvenido a los foros de Perl en Español.

Con el módulo XML::RSS puedes crear, parsear y mantener ficheros RSS (internamente usa XML::Parser para el análisis sintáctico).

Por defecto trabaja con codificación utf8, pero se puede poner la que se quiera en la salida (la que admita la función open() con algún layer indicado, como por ejemplo :utf8. Ver PerlIO)
Mensaje Mar Jun 12, 2007 8:28 pm
Linuxero
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Jun 2007
Mensajes: 4
Responder citando

Genial. Gracias.

Utilizo XML::RSS y al parsear los rss (estoy trabajando con rss's de diferentes sitios) me pilla todos los caracteres.

A continuación meto cada una de las partes de cada RSS en una base de datos (uso mysql), y también se guardan todos los caracteres perfectamente.

Después leyendo dicha base de datos construyo un .html y un .rss con por ejemplo, con todos los items (independientemente de su origen) de ayer y hoy.
(items o noticias, como más os guste)

Y ahora los caracteres acentuados, ñ's y demás no se ven correctamente. He puesto lo de la codificación en el comando 'open' para generar los ficheros y nada, no se si con 'print' se puede hacer lo mismo (uso print para escribir línea por línea en el .html y .rss) aunque también he hecho pruebas y tal, pero nada.... sigue igual.
En fin, toda ayuda es poca.

Gracias.
Un saludo.
Mensaje Mie Jun 13, 2007 12:28 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Si suponemos que los caracteres salen bien desde la base de datos, en utf8, ¿has indicado la codificación en la cabecera del HTML y del RSS?

Ejemplo, esta página tiene esta línea:
HTML:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
porque si no lo haces deberás convertir todos los caracteres 'extraños' a 'entidades HTML' (ñ => &ntilde;).

Para esto último, hay funciones en algunos módulos que te pueden ayudar en la conversión.
Mensaje Mie Jun 13, 2007 2:48 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Esto puede ser MUY interesante:

A UTF8 round trip with MySQL:
http://www.perlmonks.org/index.pl?node_id=620803
Publicar nuevo tema   Responder al tema    Foros de discusión -> Módulos Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group