Olá amigos, tenho a seguinte estrutura de xml:
<PD_Programa>
<Empresas>
<Empresa>
<TipoEmpresa>P</TipoEmpresa>
<CodEmpresa>0048</CodEmpresa>
</Empresa>
</Empresas>
<InicioVigencia>201207</InicioVigencia>
<FimVigencia>201207</FimVigencia>
<Temas>
<Tema>
<CodTema>EE</CodTema>
<JustificativasTema></JustificativasTema>
<ObjetivosTema></ObjetivosTema>
</Tema>
</Temas>
</PD_Programa>
E tenho a estrutura na classe que criei só para o uso dessa leitura de xml:
private Programa pd_programa = new Programa();
private List<EmpresaTO> empresas;
private EmpresaTO empresa = new EmpresaTO();
private String inicioVigencia;
private String fimVigencia;
private List<Tema> temas = new ArrayList<Tema>();
Estou com problema em carregar os objetos que são Listas: Empresas e Temas.
Alguém tem algum modo de ler isso? Já procurei no proprio site do xstream e lá tem a função addImplicitCollection, mas fica dizendo que não está setada a coleção.
Abaixo é como monto a leitura do xml:
[code]XStream x = new XStream(new DomDriver(“ISO-8859-1”));
x.setMode(XStream.NO_REFERENCES);
try{
File f = new File(caminhoArquivo+xml.getArquivo());
FileInputStream input = new FileInputStream(f);
x.alias("PD_Programa", PlanoEstrategicoDetalharXmlTO.class);
x.alias("Empresas", List.class);
x.alias("Empresa", PlanoEstrategicoDetalharXmlTO.class);
ObjectInputStream in = x.createObjectInputStream(input);
System.out.println( in.readObject());
}catch(Exception e){
e.printStackTrace();
}[/code]
Cara,
pq vc nao usa anotação para fazer isso, é bem mais traquilo.
posta o erro que está acontecendo.
t+
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field br.gov.chesf.ped.negocio.componente.planoestrategico.to.PlanoEstrategicoDetalharXmlTO.TipoEmpresa
---- Debugging information ----
field : TipoEmpresa
class : br.gov.chesf.ped.negocio.componente.planoestrategico.to.PlanoEstrategicoDetalharXmlTO
required-type : br.gov.chesf.ped.negocio.componente.planoestrategico.to.PlanoEstrategicoDetalharXmlTO
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[1] : java.util.ArrayList
converter-type[1] : com.thoughtworks.xstream.converters.collections.CollectionConverter
version : null
-------------------------------
Annotations? Cuma?
Massa, estava vendo mas surgiu uma dúvida que acho que não foi mostrada lá.
Por exemplo, eu tenho a lista de empresas, que cada elemento tem 2 atributos.
Como faço para mapear cada um, pois lá tem o exemplo para mapear um, tipo:
@XStreamImplicit(itemFieldName="tipoEmpresa")
private List<EmpresaTO> empresas;
Como colocar para ele mapear o codEmpresa?
entao cara,
vc nao vai ter @XStreamImplicit(itemFieldName=“tipoEmpresa”) na sua classe Programa
vc vai ter esse atributos na classe empresato, se os atributos forem o msm nome q no xml, vc nao precisa colocar nada, mas se for diferente vc vai precisa da anotacao alias para trocar o nome do atributo
Então amigo, os atributos na classe EmpresaTO tem o mesmo nome que é gerado no nó do XML:
Olha como ficou a classe anotada:
[code]@XStreamAlias(“ped”)
public class PlanoEstrategicoDetalharXmlTO {
@XStreamAlias("pd_programa")
private Programa pd_programa = new Programa();
@XStreamImplicit
private List<EmpresaTO> empresas;
@XStreamAlias("inicioVigencia")
private String inicioVigencia;
@XStreamAlias("fimVigencia")
private String fimVigencia;
@XStreamImplicit
private List<Tema> temas = new ArrayList<Tema>();[/code]
E a minha chamada dela:
[code]XStream x = new XStream(new DomDriver(“ISO-8859-1”));
x.processAnnotations(PlanoEstrategicoDetalharXmlTO.class);
try{
File f = new File(caminhoArquivo+xml.getArquivo());
FileInputStream input = new FileInputStream(f);
ObjectInputStream in = x.createObjectInputStream(input);
System.out.println(in.readObject());
}catch(Exception e){
e.printStackTrace();
} [/code]
E agora ele mostra:
com.thoughtworks.xstream.mapper.CannotResolveClassException: PD_Programa
Lembrando que o que quero fazer é: ler um xml de um lugar tal, e transforma-lo em objeto.
cara,
acho que vc nao entendeu o intuito do xstream, ele trabalha com orientacao de objeto, vc vai ter uma classe que representa a tag do seu xml, PD_Programa e essa classe por sua vez possui uma lista de empresas, assim por diante
Entendi sim amigo, vê comigo se não está de uma forma orientada a objetos:
Essa é minha estrutura do xml:
<?xml version="1.0" encoding="ISO88591"?>
<PED Tipo="PROGRAMA" CodigoEmpresa="0048">
<PD_Programa>
<Empresas>
<Empresa>
<TipoEmpresa>P</TipoEmpresa>
<CodEmpresa>0048</CodEmpresa>
</Empresa>
</Empresas>
<InicioVigencia>201207</InicioVigencia>
<FimVigencia>201207</FimVigencia>
<Temas>
<Tema>
<CodTema>EE</CodTema>
<JustificativasTema></JustificativasTema>
<ObjetivosTema></ObjetivosTema>
</Tema>
</Temas>
</PD_Programa>
</PED>
Veja que tenho a raiz que é a minha classe postada anteriormente, e dentro dela tenho a lista de empresas, a lista de temas, inicioVigencia e fimVigencia que são um atributos da classe que possui as listas.
Se olhar direitinho estão montados corretamente.
Ainda fiz melhor, vê só:
Essa é a classe pai agora:
[code]@XStreamAlias(“ped”)
public class PlanoEstrategicoDetalharXmlTO {
@XStreamAlias("PD_Programa")
private ProgramaPlanoEstrategicoTO pd_programa;
public ProgramaPlanoEstrategicoTO getPd_programa() {
return pd_programa;
}
public void setPd_programa(ProgramaPlanoEstrategicoTO pdPrograma) {
pd_programa = pdPrograma;
}[/code]
E o atributo “pd_programa” é do tipo ProgramaPlanoEstrategicoTO :
[code]@XStreamAlias(“PD_Programa”)
public class ProgramaPlanoEstrategicoTO {
@XStreamImplicit
private List<EmpresaTO> empresas;
@XStreamAlias("inicioVigencia")
private String inicioVigencia;
@XStreamAlias("fimVigencia")
private String fimVigencia;
@XStreamImplicit
private List<Tema> temas;[/code]
E dai o danado agora mostrou um erro mais descente:
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field br.gov.chesf.ped.negocio.componente.planoestrategico.to.ProgramaPlanoEstrategicoTO.Empresas
---- Debugging information ----
field : Empresas
class : br.gov.chesf.ped.negocio.componente.planoestrategico.to.ProgramaPlanoEstrategicoTO
required-type : br.gov.chesf.ped.negocio.componente.planoestrategico.to.ProgramaPlanoEstrategicoTO
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path : /PD_Programa/Empresas
version : null
-------------------------------
agora ta correto… rsrs
no seu xml a tag PED, vc tem q criar dois atributos e vai ser anotada como stream atributte,
vc nao vai ter a anotacao xstream implicit.
e manda o erro q ta acorrendo agora
Amigo, não creio ter entendido sua explicação:
Tipo vc disse para eu criar 2 atributos ( ONDE? Na classe pai ou na do tipo ProgramaPlanoEstrategicoTO? ), quais atributos?
cara,
uma dica para trabalhar com xstream seria fazer o servico ao contrario, criar uma estrutura de teste de objetos java e ve se o resultado do xml é o msm que vc espera.
vai ter ajudar.
T+
Isso já foi feito numa classe Main para testes, e o que estou querendo segue correto entre a estrutura.
Sobre o ultimo erro que postei, pelo que entendi, na minha classe que está anotada como (“ped”) ele não encontra o atributo Empresas que foi colocado em uma nova classe que é do tipo ProgramaPlanoEstrategico que está definida com anotação do xmlAlias (“pd_programa”).
Adicionei o atributo e ainda assim ele não o encontra.
cara,
o resultado que vc obteve no teste é o msm q seu xml q vc obtem?
sua classe deve ta assim
@XStreamAlias("PED")
public class PlanoEstrategicoDetalharXmlTO {
@XStreamAlias("PD_Programa")
private ProgramaPlanoEstrategicoTO pd_programa;
public ProgramaPlanoEstrategicoTO getPd_programa() {
return pd_programa;
}
public void setPd_programa(ProgramaPlanoEstrategicoTO pdPrograma) {
pd_programa = pdPrograma;
}
@XStreamAlias("PD_Programa")
public class ProgramaPlanoEstrategicoTO {
@XStreamAlias("Empresas")
private List<EmpresaTO> empresas;
@XStreamAlias("InicioVigencia")
private String inicioVigencia;
@XStreamAlias("FimVigencia")
private String fimVigencia;
@XStreamAlias("Temas")
private List<Tema> temas;