Caso ainda não tenha precisado criar ou ler arquivos XML em Java, pelo menos já parou pra pensar como fazer isso? Criar uma String gigante concatenando valores e tags? Hoje em dia não há necessidade de se utilizar métodos tão "complexos" assim. Existe uma biblioteca chamada de XStream, onde objetos podem ser transformados em XML, e vice versa.
Obs: o XStream gera uma String em formato de XML, e não o arquivo XML propriamente dito, mas este é gerado com a ajuda do FileOutputStream do Java.
Então para fazer este exemplo vamos precisar de dois .jar, um é do próprio XStream e o outro é o Dom4J. Para baixar os dois juntos, clique aqui.
Estrutura do projeto
Nosso projeto irá ficar com essa estrutura:
Depois de muito tempo venho editar esta postagem sobre XStream...
Dentro do pacote model temos duas classes, um é o Endereco e a outra é Pessoa.
Classe Endereco:
A Classe Pessoa:
Bom agora vamos ver o que desejamos fazer e como fazer... Vamos começar pelo mais simples, caso queira gerar um XML de um endereço que está dessa forma:
Eu preciso do seguinte código:
Lembrando que a parte de gravar o arquivo não é do XStream, a String é gerada pelo seguinte código: xStream.toXML(endereco), o mesmo vale para os próximos métodos...
Agora caso queira gravar uma lista de endereços em XML, que fique dessa forma:
É necessário o seguinte método:
Agora vamos ver algo mais complicado, que é gravar objetos que contenham listas dentro dele... ou seja vamos criar um XML que represente uma lista de pessoas (nosso model lá do início):
Observação final: como vocês podem ver, eu não coloquei um endereço fixo de onde armazenar meus arquivos, era apenas new file("endereco.xml") ... para quem não sabe isso gera o arquivo dentro da pasta do projeto.
Obs: o XStream gera uma String em formato de XML, e não o arquivo XML propriamente dito, mas este é gerado com a ajuda do FileOutputStream do Java.
Então para fazer este exemplo vamos precisar de dois .jar, um é do próprio XStream e o outro é o Dom4J. Para baixar os dois juntos, clique aqui.
Estrutura do projeto
Nosso projeto irá ficar com essa estrutura:
Depois de muito tempo venho editar esta postagem sobre XStream...
Dentro do pacote model temos duas classes, um é o Endereco e a outra é Pessoa.
Classe Endereco:
@XStreamAlias("endereco")
public class Endereco {
private String rua;
private String cidade;
//gettters e setters
}
A anotação @XStreamAlias é necessária quando vai fazer a leitura de uma String XML.A Classe Pessoa:
public class Pessoa {
private String nome;
private String cpf;
private List<Endereco> enderecos;
//getters e setters
}
Bom agora vamos ver o que desejamos fazer e como fazer... Vamos começar pelo mais simples, caso queira gerar um XML de um endereço que está dessa forma:
<endereco> <rua>Rua das araras</rua> <cidade>Primavera do Leste</cidade> </endereco>
Eu preciso do seguinte código:
private static void gravaEndereco() {
Endereco endereco = new Endereco();
endereco.setCidade("Primavera do Leste");
endereco.setRua("Rua das araras");
XStream xStream = new XStream();
xStream.alias("endereco", Endereco.class);
File arquivo = new File("endereco.xml");
FileOutputStream gravar;
try {
gravar = new FileOutputStream(arquivo);
gravar.write(xStream.toXML(endereco).getBytes());
gravar.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
Lembrando que a parte de gravar o arquivo não é do XStream, a String é gerada pelo seguinte código: xStream.toXML(endereco), o mesmo vale para os próximos métodos...
Agora caso queira gravar uma lista de endereços em XML, que fique dessa forma:
<enderecos>
<endereco>
<rua>Rua abc</rua>
<cidade>Cuiaba</cidade>
</endereco>
<endereco>
<rua>Avenida São João</rua>
<cidade>Primavera do Leste</cidade>
</endereco>
</enderecos>
É necessário o seguinte método:
private static void gravaListaEndereco() {
List<Endereco> enderecos = new ArrayList<Endereco>();
Endereco e1 = new Endereco();
e1.setCidade("Cuiaba");
e1.setRua("Rua abc");
enderecos.add(e1);
Endereco e2 = new Endereco();
e2.setCidade("Primavera do Leste");
e2.setRua("Avenida São João");
enderecos.add(e2);
XStream xStream = new XStream();
xStream.alias("enderecos", List.class);
xStream.alias("endereco", Endereco.class);
File arquivo = new File("enderecos.xml");
FileOutputStream gravar;
try {
gravar = new FileOutputStream(arquivo);
gravar.write(xStream.toXML(enderecos).getBytes());
gravar.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
Agora vamos ver algo mais complicado, que é gravar objetos que contenham listas dentro dele... ou seja vamos criar um XML que represente uma lista de pessoas (nosso model lá do início):
<pessoas>
<pessoa>
<nome>Andii</nome>
<cpf>123.123.123-34</cpf>
<enderecos>
<endereco>
<rua>Rua 123</rua>
<cidade>Primavera do Leste</cidade>
</endereco>
</enderecos>
</pessoa>
<pessoa>
<nome>Maria</nome>
<cpf>345.656.235-98</cpf>
<enderecos>
<endereco>
<rua>Avenida das flores</rua>
<cidade>Cuiabá</cidade>
</endereco>
<endereco>
<rua>Rua das abelhas</rua>
<cidade>Cuiabá</cidade>
</endereco>
</enderecos>
</pessoa>
</pessoas>
Para gerar esta estrutura precisamos o seguinte método:private static void gravaListaCompleta() {
Pessoa pessoa1 = new Pessoa();
pessoa1.setNome("Andii");
pessoa1.setCpf("123.123.123-34");
Endereco endereco1 = new Endereco();
endereco1.setCidade("Primavera do Leste");
endereco1.setRua("Rua 123");
List<Endereco> enderecos1 = new ArrayList<Endereco>();
enderecos1.add(endereco1);
pessoa1.setEnderecos(enderecos1);
Pessoa pessoa2 = new Pessoa();
pessoa2.setNome("Maria");
pessoa2.setCpf("345.656.235-98");
Endereco endereco2 = new Endereco();
endereco2.setCidade("Cuiabá");
endereco2.setRua("Avenida das flores");
Endereco endereco3 = new Endereco();
endereco3.setCidade("Cuiabá");
endereco3.setRua("Rua das abelhas");
List<Endereco> enderecos2 = new ArrayList<Endereco>();
enderecos2.add(endereco2);
enderecos2.add(endereco3);
pessoa2.setEnderecos(enderecos2);
List<Pessoa> pessoas = new ArrayList<Pessoa>();
pessoas.add(pessoa1);
pessoas.add(pessoa2);
XStream xStream = new XStream();
xStream.alias("pessoas", List.class);
xStream.alias("pessoa", Pessoa.class);
xStream.alias("endereco", Endereco.class);
File arquivo = new File("pessoas.xml");
FileOutputStream gravar;
try {
gravar = new FileOutputStream(arquivo);
gravar.write(xStream.toXML(pessoas).getBytes());
gravar.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
E enfim para lermos uma String XML, precisamos do método abaixo, para o exemplo de leitura eu estarei utilizando o arquivo gerado em um dos métodos acima, aquele que gera uma lista de endereços:private static void lerXML() {
try {
XStream xStream = new XStream(new Dom4JDriver());
xStream.alias("enderecos", ArrayList.class);
xStream.processAnnotations(Endereco.class);
BufferedReader input = new BufferedReader(new FileReader("enderecos.xml"));
ArrayList<Endereco> enderecos = (ArrayList) xStream.fromXML(input);
input.close();
for (Endereco endereco : enderecos) {
System.out.println("Endereço: " + endereco.getRua() + " - " + endereco.getCidade());
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
Veja que eu leio o arquivo utilizando BufferedReader e tendo esse arquivo "carregado" utilizo do XStream para gerar uma lista para mim... Lembrando que dessa vez eu preciso da anotação lá na classe Endereco, o resultado da leitura do método acima é:Endereço: Rua abc - Cuiaba Endereço: Avenida São João - Primavera do LesteBom... peço desculpas pela demora a fazer as explicações do XStream... Mas está aí :)
Observação final: como vocês podem ver, eu não coloquei um endereço fixo de onde armazenar meus arquivos, era apenas new file("endereco.xml") ... para quem não sabe isso gera o arquivo dentro da pasta do projeto.
















































