1
resposta

Ler XML

Olá pessoal. O código abaixo não funciona quando tem mais de uma tag com o mesmo nome, sendo que isso é comum em arquivos XML. Eu fiz a leitura pelo xstream.alias, xstream.aliasField e xstream.useAttributeFor ao invés de usar Unmarshall com os moveDown e moveUp.

Segue meus codigos e, no final, o erro:

String xmlTeste2 = "<listaProdutos">\n"

                        + "<produto codigo=\"1587\">\n"
                        + "  <nome>geladeira</nome>\n"
                        + "  <preco>1000.0</preco>\n"
                        + "  <descrição>geladeira duas portas</descrição>\n"
                        + "</produto>"
                        + "<produto codigo=\"1588\">\n"
                        + "  <nome>geladeira</nome>\n"
                        + "  <preco>1000.0</preco>\n"
                        + "  <descrição>geladeira duas portas</descrição>\n"
                        + "</produto>"
                        + "</listaProdutos>";

    XStream xstream = new XStream();
    xstream.alias("listaProdutos", Produto.class);
    xstream.alias("produto", Produto.class);
    xstream.useAttributeFor(Produto.class, "codigo");
    xstream.alias("nome", Produto.class);
    xstream.alias("preco", Produto.class);
    xstream.aliasField("descrição", Produto.class, "descricao");

    Produto compraTeste2 = (Produto) xstream.fromXML(xmlTeste2);

    System.out.println("\n" + compraTeste2.getCodigo());
    System.out.println(compraTeste2.getNome());
    System.out.println(compraTeste2.getPreco());
    System.out.println(compraTeste2.getDescricao());

classe:

public class Produto {

private String listaProdutos;
private String produto;
private String nome;
private double preco;
private String descricao;
private int codigo;

getters e setters...

Erro:

Exception in thread "main" com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field produto
---- Debugging information ----
field               : produto
class               : br.com.alura.Produto
required-type       : br.com.alura.Produto
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /listaProdutos/produto[2]
line number         : 7
version             : null
1 resposta

Repare no xml que as tags estão envolvidas na tag . Isso indica ao XStream que o XML contém uma lista de elementos, no caso ficaria algo assim:

XStream xstream = new XStream(new DomDriver());
xstream.alias("produto", Produto.class);
FileInputStream inputStream = new FileInputStream(new File("/caminho/do/seu/xml"));
List<Produto> produtos = (List<Produto>) xstream.fromXML(inputStream);