Jue Jun 07, 2007 5:40 am
|
 |
Linuxero
Perlero Nuevo

|
Registrado: 07 Jun 2007
Mensajes: 4
|
|
| XML -> RSS |
|
|
¡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. |
|
|
|

Jue Jun 07, 2007 7:48 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
|
|
|
|
|
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) |
|

Mar Jun 12, 2007 8:28 pm
|
 |
Linuxero
Perlero Nuevo

|
Registrado: 07 Jun 2007
Mensajes: 4
|
|
|
|
|
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. |
|

Mie Jun 13, 2007 12:28 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
|
|
|
|
|
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' (ñ => ñ).
Para esto último, hay funciones en algunos módulos que te pueden ayudar en la conversión. |
|
Mie Jun 13, 2007 2:48 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
|
|
|
|
Powered by phpBB © 2001, 2005 phpBB Group
|