Criando XML no Rails com caracteres acentuados
Há aproximadamente um ano atrás me deparei com um problema: precisava gerar um arquivo XML a partir dos dados que eu tinha no BD, para fazer a integração com um sistema externo. O meu problema era que, ao criar o XML, os caracteres acentuados eram mostrados codificados. Por exemplo, no lugar do ã era mostrado o código ã.
Me lembro que recorri a listas de discussão, fóruns, trabalhei com o ICONV, unpack, tentei fazer conversão entre conjuntos de caracteres e outras coisas… só não fiz uma reza braba porque não dava tempo.
Como o problema era com um único campo, acabei encontrando outra solução mais prática do que técnica, que me atendeu muito bem na época.
Mas agora, 12 meses depois, me deparei com o mesmo problema, só que agora precisava exportar não apenas um campo, mas uma série de campos. Remover os caracteres acentuados seria inviável, pois não se tratava apenas de um nome de uma pessoa, mas de um relatório. Comecei novamente a caçada pela solução.
Só que desta vez, munido de um pouco mais de experiência, fui analisar o código fonte do framework para entender o que estava acontecendo, e acabei descobrindo (não só analisando o fonte, mas com uma pequena grande ajuda dos nossos amigos blogueiros) que o método utilizado para incluir o texto no XML (XmlMarkup.tag!) repassava o conteúdo para o método to_xs antes de incluir a string no XML. Era essa a função que estava azarando todo o resultado final!
Depois de ler muita documentação, encontrei a solução: usar o operador << para incluir o texto no XML sem passar pelo método to_xs, ou seja, para “pular” a fase de “escapar” (numa tradução porca) os caracteres especiais.
Assim, ao invés de fazer …
xml.tag!(:suatag, seuobjeto.seucampo)
… você pode fazer …
xml.suatag {
xml << seuobjeto.seucampo
}
Sei que alguns podem criticar o fato de, dessa forma, você estar incluindo no seu XML qualquer coisa, talvez até mesmo abrindo alguma brecha (do tipo injection, por exemplo), mas fica aí a dica: se não quiser que o Rails “escape” suas strings, use o operador <<.



Últimos Comentários