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: Seleccionar todo
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.