Arquivo para a tag ‘xml’
Devolvendo um texto como attachment no response
Me deparei com a seguinte situação em uma aplicação construída usando Grails.
O sistema gravaria o conteúdo de um arquivo (plain xml mesmo) dentro do banco de dados, para evitar dependências com filesystem. Mas este arquivo também precisaria ser lido posteriormente. A solução que estava disponível, era alguma coisa mais ou menos assim:
def arquivo = Arquivo.get(params.id) //recupera o arquivo da base render arquivo.texto
Legal, desta maneira (bem simples até), o conteúdo deste texto seria renderizado na página para o usuário poder salvá-la.
Imaginei que isto pudesse ser incrementado um pouco, e percebi que fazer com que o usuário tivesse que salvar a página (que continha apenas o XML) poderia se tornar um tanto chato com o passar do tempo. Resolvi alterar a action para devolver o texto em anexo ao response. Isso mesmo, com a caixinha para poder salvá-lo.
Olha que simples:
def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
response.setContentType "text/xml"
response.setHeader "Content-Disposition", "attachment;filename=\"${arquivo.nome}.xml\""
response << arquivo.texto
Simples, colocando a instrução no header para que a “disposição” da resposta seja “attachment” (anexo), o browser ao invés de renderizar apenas o conteudo, retorna um arquivo com este texto.
Visualizando XMLs no Safari de forma decente
Se você usa um Mac e navega com o Safari, com certeza sofre pra visualizar XMLs nele, fica como o firefox antigo, uma bagunça.
Neste caso, acaba tendo que abrir o source da página para conseguir ler o conteúdo.
Este plugin do safari, chamado XMLView Plugin com certeza me ajuda muito e pode te ajudar. É muito simples, basta descompactar seu conteúdo em $HOME/Library/Internet Plug-Ins e reiniciar o navegador.
Depois de reiniciar o Safari, abra qualquer XML e faça o teste! Use e abuse do layout bem definido e opções de expand/collapse dos nós. Veja abaixo um exemplo:

Safari vendo XML com o plugin XMLView Plugin
Se gostou, me deve um real. :)
Renderizando um XML como resposta em grails
Se em grails você precisar renderizar um XML como resposta de uma action, use o método render junto com o builder de XML que temos disponível. Muito fácil, rápido e objetivo.
No exemplo abaixo, um parâmetro nome é passado para a action, que faz uma consulta baseado neste parâmetro e nos nomes dos clientes.
def busca = {
def clientes = Cliente.findAllByNomeIlike("%${params.nome}%")
render(contentType: "text/xml") {
results() {
clientes.each {
cliente -> result() {
id(cliente.id)
nome(cliente.nome)
}
}
}
}
}
Explicando o auto-explicativo:
Linha 2: Usamos um método dinâmico do grails (não, este método não existe na classe) que permite que eu localize todos os clientes (findAll) por seus nomes (byNome) Ilike (case insensitive) usando o parâmetro nome que veio no request. Esta lista é armazenada na referência clientes.
Linha 4: Pela funcão render deixamos claro que iremos renderizar um conteúdo text/xml
Linha 5: Esta será a nossa tag root do xml: results. A closure que se abre definirá os filhos deste nó.
Linha 6: Cada cliente na lista retornada…
Linha 7: Será um novo nó result do XML de resposta
Linhas 8 e 9: Os fois filhos de result, teremos o id do cliente e seu nome, suficiente para uma combo com auto-complete!
O resultado foi como esperado, e o tempo de fazer o exemplo funcionar foi definitivamente menor que o de escrever este post!
<results>
<result>
<id>313</id>
<nome>JOSE DA SILVA</nome>
</result>
<result>
<id>817</id>
<nome>PATRICIA MARIA SILVA E SILVA</nome>
</result>
<result>
<id>91</id>
<nome>MARCOS SILVINO</nome>
</result>
</results>