Vraptor 3 - XML

16 respostas
H

Boa noite a todos!

Estou com uma dúvida que é a seguinte: Tenho uma action no controller que gera o sitemap.xml para os indexadores dos mecanismos de musica só que preciso colocar um atributo na primeira tag

Como posso fazer isso?

/**
     * Exibe o sitemap.xml que o google precisa para indexar o site
     */
    @Path(value="/sitemap.xml")
    public void sitemap(){
        ArrayList<URL> xml = sitemap.getSitemap();
        result.use(Results.xml()).from(xml,"urlset").serialize();
    }

Desde já, Agradeço.

Fique com Deus, Jesus te ama.

16 Respostas

G

O mais fácil é você criar uma classe com todos os atributos do sitemap que você precisa e serializar ela. Algo como:

public class Sitemap { private String xmlns = "xxxxxxxxxxxxxxx"; ... outros valores }

E em seu controller:

@Path(value="/sitemap.xml") public void sitemap(){ Sitemap out = new Sitemap(); result.use(Results.xml()).from(out).serialize(); }

Lucas_Cavalcanti

o VRaptor usa o XStream pra serializar xmls (e jsons), e ele não tem suporte direto a namespaces…

o que vc vai precisar fazer é quase o que o garcia falou…

no seu sitemap:

public class Sitemap {
   @XStreamAsAttribute
   private String xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9";

  @XStreamImplicit
  private List<URL> urls;
  //...
}

e possivelmente vc vai precisar criar a classe:

@Component
public class CustomXMLSerialization extends XStreamXMLSerialization {
    //delegate constructor
    @Override
    protected XStream getXStream() {
          XStream xstream = super.getXStream();
          xstream.processAnnotations(Sitemap.class);
          return xstream;
    }
}
H

Ainda não testei mas acredito que não vai funcionar muito bem pq teria que ser assim o xml

// conteudo // conteudo
class Sitemap {
     private String xmlns = "";
     private List<URL> urls;
}

Se eu mandar serializar o objeto sitemap, provavelmente vai ficar assim:

// conteudo

não?

Lucas_Cavalcanti

por causa do @XStreamImplicit ele não vai colocar a tag , logo a sua classe ficaria serializada:

<sitemap xmlns="...">
<url>
// conteudo
</url>
<url>
// conteudo
</url>
</sitemap>

e se na hora de gerar o result vc fizer:

result.use(xml()).from(sitemap, "urlset").include("urls").serialize();

ele vai gerar o xml:

<urlset xmlns="...">
<url>
// conteudo
</url>
<url>
// conteudo
</url>
</urlset>
G

Lucas, isso que você sugeriu não vai alterar a forma que o xstream irá chamar o marshaller/unmarshaller?

Lucas_Cavalcanti

sim… ele vai considerar as anotações do Sitemap sempre que serializar algum objeto… se o objeto não tiver relação com Sitemap não vai acontecer nada.

G

Lucas, não conheço muito bem o tal sitemap, mas acho tem algo errado. O XML tem que ser conforme o que está abaixo:

<urlset xmlns="xxxxxxxxx"> <url> <loc>xxxxxxxxx</loc> <lastmod>xxxxxxxxx</lastmod> <changefreq>xxxxxxxxx</changefreq> <priority>xxxxxxxxx</priority> </url> </urlset>

A classe que você mandou gera diferente. Acho que teria que criar uma classe para o nó urlset/url. O que você acha?

Lucas_Cavalcanti

a classe que eu mandei, junto com as configurações, vai gerar assim mesmo…

desde que a classe URL tenha os atributos loc, lastmod, changefreq e priority

G

Lucas Cavalcanti:
a classe que eu mandei, junto com as configurações, vai gerar assim mesmo…

desde que a classe URL tenha os atributos loc, lastmod, changefreq e priority

:oops: Achei que era a classe java.net.URL, hehehe. Sorry.

Lucas_Cavalcanti

na verdade eu não tenho certeza se esse URL é java.net.URL ou não… :stuck_out_tongue:

heliortf, qual classe URL vc está usando?

H

Uma classe minha que eu criei, apenas com os atributos referentes ao xml.

G

Lucas, nesses casos não há como deixar o vraptor/xstream fazer parse das anotações sempre? Digo, deixar no core do vraptor para ele sempre usar annotations?

Há nesse caso uma perda significativa de performance do xstream usar annotations por padrão?

Lucas_Cavalcanti

acho que não tem problema ler anotações por padrão… de qqer forma vou falar com um dos commiters do xstream q eu conheço e ver se tem problema…

G

Outra coisa que notei na geração de XML via Vraptor que o cabeçalho não está vindo:

Lucas_Cavalcanti

É culpa do xstream:

http://xstream.codehaus.org/faq.html#XML_write_XML_declaration

H

Funcionou!!

Muito obrigado a todos.

Jesus os abençoe

Criado 20 de fevereiro de 2010
Ultima resposta 22 de fev. de 2010
Respostas 16
Participantes 3