Ler XML simples com XStream [RESOLVIDO]

10 respostas
T

Bom dia.

Estou tentando ler um xml simples e converter esses valores em objetos Java.

Como nunca tinha feito isso, pesquisei na net sobre a API XStream.

Tentei implementar aqui, porém obtive um erro.

Para facilitar vou postar 3 classes que desenvolvi aqui, todas básicas:

package model;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("param")
public class Param 
{
    private String operacao;
    private String cnpj;
    private String caminhoXML;
    private String alias;
    private String senha;
    private String url;
    private String acao;
    private String uf;

    public String getAcao() {
        return acao;
    }

    public void setAcao(String acao) {
        this.acao = acao;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    public String getCaminhoXML() {
        return caminhoXML;
    }

    public void setCaminhoXML(String caminhoXML) {
        this.caminhoXML = caminhoXML;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public String getOperacao() {
        return operacao;
    }

    public void setOperacao(String operacao) {
        this.operacao = operacao;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    } 
}
package model;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.Dom4JDriver;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class XML 
{
    public void leXML()
    {
        try
        {
            XStream xstream = new XStream(new Dom4JDriver());
            xstream.alias("param", Param.class);
            
            xstream.processAnnotations(Param.class);
            
            BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\thiago.beserra\\Desktop\\xml_parametros_maicon.xml"));
            
            Param p = (Param) xstream.fromXML(br);
            
            br.close();
            
            System.out.println(p.getCaminhoXML());
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

E POR ULTIMO A CLASSE MAIN:

package lexml;

public class LeXML 
{
    public static void main(String[] args) 
    {
        new model.XML().leXML();
    }
}

ERRO:

Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: caminhoXml : caminhoXml : caminhoXml : caminhoXml
---- Debugging information ----
message             : caminhoXml : caminhoXml
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : caminhoXml : caminhoXml
class               : model.Param
required-type       : model.Param
path                : /param/caminhoXml
xpath               : /param/caminhoXml
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
	at model.XML.leXML(XML.java:23)
	at lexml.LeXML.main(LeXML.java:8)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: caminhoXml : caminhoXml
	at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:347)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:208)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	... 10 more
Java Result: 1

Creio que é erro de conversão, mas não consegui identificar o exato erro. Estou precisando desse tipo de conversão XML/Objeto para implementar num módulo que estou criando para NFe aqui onde trabalho.

Qualquer Ajuda agradeço :smiley:

10 Respostas

R

Da uma lida nesse tutorial: http://wp.me/p1iE6J-4Q

T

só pra reforçar o POST, o XML que estou tentando ler é este:

<param>
	<operacao>2</operacao>
	<cnpj>123456</cnpj>
	<caminhoXml>D:\XML-LoteCCe-Teste.xml</caminhoXml>
	<alias>c:\cert.pfx</alias>
	<senha>111</senha>
	<url>wsdl</url>
	<acao>Cce</acao>
	<uf>35</uf>
</param>
T

Vou olhar lá! Valeu pela ajuda XD

T

Vou olhar lá! Valeu pela ajuda XD

romarcio, Li o artigo que você me passo, da hora!

Até implementei uma função que tem lá para ler XMLs. Mas o erro foi o mesmo.

A minha classe então ficou com 2 funções de leitura, porém bem parecidas:

package model;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.extended.EncodedByteArrayConverter;
import com.thoughtworks.xstream.io.xml.Dom4JDriver;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class XML 
{
    public void leXMLAnnotation()
    {
        FileReader reader = null;
        try {
            //carrega o arquivo XML para um objeto reader
            reader = new FileReader(
            "C:\\Users\\thiago.beserra\\Desktop\\param.xml"
            );
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //Cria o objeto xstream
        XStream xStream = new XStream(new DomDriver());
        //Para ler vamos utilizar outro método o
        //processAnnotations() e como parâmetro passamos
        //a classe que possui as anotações
        xStream.processAnnotations(Param.class);

        Param param = (Param) xStream.fromXML(reader);
        System.out.println(param.getCaminhoXML());
    }
    
    public void leXML()
    {
        try
        {
            XStream xstream = new XStream(new DomDriver());
            //xstream.registerConverter(new EncodedByteArrayConverter());
            xstream.alias("param", Param.class);
            
            xstream.processAnnotations(Param.class);
            
            BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\thiago.beserra\\Desktop\\param.xml"));
            
            Param p = (Param) xstream.fromXML(br);
            
            br.close();
            
            System.out.println(p.getCaminhoXML());
        }
        catch(IOException e)
        {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
}

Segue o erro, praticamente identico: =/

Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: caminhoXml : caminhoXml : caminhoXml : caminhoXml
---- Debugging information ----
message             : caminhoXml : caminhoXml
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : caminhoXml : caminhoXml
class               : model.Param
required-type       : model.Param
path                : /param/caminhoXml
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
	at model.XML.leXMLAnnotation(XML.java:33)
	at lexml.LeXML.main(LeXML.java:8)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: caminhoXml : caminhoXml
	at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:347)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:208)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	... 10 more
Java Result: 1

Será que anotei a classe bean direito?

@XStreamAlias("param")

Achei que ler um XML com XStream era facim…hehe

Se alguém tiver idéia do que possa ser, agradeço!

C

Altere:

private String caminhoXML;

para:

private String caminhoXml; - //O nome da variável deve ser o mesmo do elemento &lt;caminhoXml&gt; do seu xml.

Flws.

P

Parece-me que está alguma coisa mal aqui, não concordas?

T

pmlm:
Thiago de Paula Beserra:

private String caminhoXML;
message             : caminhoXml : caminhoXml

Parece-me que está alguma coisa mal aqui, não concordas?

Que tinha algo errado era certeza. Pra concorda não dava por que não entendi muito bem a mensagem que você me mando pra tenta soluciona…hehe
mas valeu pela dica, o erro é ai mesmo!

T

CyberX:
Altere:

private String caminhoXML;

para:

private String caminhoXml; - //O nome da variável deve ser o mesmo do elemento &lt;caminhoXml&gt; do seu xml.

Flws.

Valeu CyberX. [RESOLVIDO]. Você mato o problema…hehe

Obrigado! :smiley:

P

Era exactamente isso que eu estava a tentar mostrar-te. Não quis dar foi de mão beijada :slight_smile:
Os nomes estavam diferentes.

T

pmlm:
Era exactamente isso que eu estava a tentar mostrar-te. Não quis dar foi de mão beijada :slight_smile:
Os nomes estavam diferentes.

hehe…Entendi!!

Valeu pela ajuda :smiley:

Criado 18 de junho de 2012
Ultima resposta 18 de jun. de 2012
Respostas 10
Participantes 4