Duvida em XStream

7 respostas
Flavio_Luiz

Pessoa eu to com uma duvida aqui…
Preciso ler arquivos XML´de um diretorio, estou usando o XStream para isso… quando a isso sem problemas…
o problema é,como eu vou encontrar o arquivo xml q procuro ?
Suponhamos que eu procuro um xml q tenha essa estrutura…

<person> <firstname>Joe</firstname> <lastname>Walnes</lastname> <phone> <code>123</code> <number>1234-456</number> </phone> <fax> <code>123</code> <number>9999-999</number> </fax> </person>

mas em meu diretorio eu vou ter arquivos xml assim

<usisite> <requestmap> <request pattern="index.do" view="index.vm" class="net.usi.site.requests.IndexRequest" /> <request pattern="index_top.do" view="index_top.vm" class="net.usi.site.requests.IndexTopRequest" /> <request pattern="index_left.do" view="index_left.vm" class="net.usi.site.requests.IndexLeftRequest" /> <request pattern="clientes.do" view="clientes.vm" class="net.usi.site.requests.ClientesRequest" /> <request pattern="perfil.do" view="perfil.vm" class="net.usi.site.requests.PerfilRequest" /> <request pattern="projetos.do" view="projetos.vm" class="net.usi.site.requests.ProjetosRequest" /> <request pattern="sobre.do" view="sobre.vm" class="net.usi.site.requests.SobreRequest" /> <request pattern="contato.do" view="contato.vm" class="net.usi.site.requests.ContatoRequest" /> </requestmap> </usisite>

ou tbm posso encontrar as duas coisa em um unico XML…

<usisite> <requestmap> <request pattern="index.do" view="index.vm" class="net.usi.site.requests.IndexRequest" /> <request pattern="index_top.do" view="index_top.vm" class="net.usi.site.requests.IndexTopRequest" /> <request pattern="index_left.do" view="index_left.vm" class="net.usi.site.requests.IndexLeftRequest" /> <request pattern="clientes.do" view="clientes.vm" class="net.usi.site.requests.ClientesRequest" /> <request pattern="perfil.do" view="perfil.vm" class="net.usi.site.requests.PerfilRequest" /> <request pattern="projetos.do" view="projetos.vm" class="net.usi.site.requests.ProjetosRequest" /> <request pattern="sobre.do" view="sobre.vm" class="net.usi.site.requests.SobreRequest" /> <request pattern="contato.do" view="contato.vm" class="net.usi.site.requests.ContatoRequest" /> </requestmap> </usisite> <person> <firstname>Joe</firstname> <lastname>Walnes</lastname> <phone> <code>123</code> <number>1234-456</number> </phone> <fax> <code>123</code> <number>9999-999</number> </fax> </person>

como eu faço para identificar se o xml q estou lendo tem as tag q procuro ???

7 Respostas

viniciusfaleiro

Cara.. se vc criar uma entidade na hora do parse do XML pra objeto ele gera um erro eu acho.. não tenho certeza..

Na teoria ele só aceitaria XMLS com a mesma estrutura da sua entidade..

Já testou?

[/code]
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package Entities;

import java.util.Date;

/**
*
* @author Vinicius
*/
public class Message {
private String msg;
private String sender;
private Date data_criacao;

public Message(){
data_criacao = new Date(System.currentTimeMillis());
}

/**
* @return the msg
*/
public String getMsg() {
return msg;
}

/**
* @param msg the msg to set
*/
public void setMsg(String msg) {
this.msg = msg;
}

/**
* @return the sender
*/
public String getSender() {
return sender;
}

/**
* @param sender the sender to set
*/
public void setSender(String sender) {
this.sender = sender;
}

/**
* @return the data_criacao
*/
public Date getData_criacao() {
return data_criacao;
}

/**
* @param data_criacao the data_criacao to set
*/
public void setData_criacao(Date data_criacao) {
this.data_criacao = data_criacao;
}

}
no cast deve gerar um erro....
String data = in.readUTF();

System.out.println("Mensagem Recebida!");

XStream xlm = new XStream(new DomDriver());

msg = (Message) xlm.fromXML(data);[code]

Flavio_Luiz

sim sim… eu testei… ta rolando… só q agora estou com um problema…
meu xml é assim…

personData> <name>Scott Tiger</name> <additionalData> <addressName>Fifth avenue</addressName> <addressNumber>123</addressNumber> <cityName>New York</cityName> <stateUnitName>New york</stateUnitName> <countryName>USA</countryName> </additionalData> <phoneList> <phoneNumber>11 5544334</phoneNumber> <phoneNumber>11 5544222</phoneNumber> </phoneList> <birthDate>dd/mm/yyyy</birthDate> <document>[CPF removido]</document> <email>[email removido]</email> </personData>

como podem ver tenho uma list de phoneNumber, em minha entidade eu criei uma lista phoneList
quando vou ler o xml mapiei ele assim…

xstream.alias("phoneNumber",PhoneList.class);

o PhoneList é uma classe minha de telefone

public class PhoneList {
	private String phoneNumber;
   
   ...
}

com isso ele roda normal e minha lista de telefone vem com a quantidade de numeros mas os seus valores vem nulos…
alguem sabe o pq ?

peron

A classe PhoneList deve ser :

public class PhoneList {
        private int code;
	private String phone;
   
   ...
}

que vai funcionar.

falow

Flavio_Luiz

Peron… me desculpa…
mas vc poderia me exeplicar o porque ?

peron

Veja,

Acho que me enganei com o seu xml de dados. se for esse:

personData>
        <name>Scott Tiger</name>
          <additionalData>
            <addressName>Fifth avenue</addressName>
            <addressNumber>123</addressNumber>
            <cityName>New York</cityName>
            <stateUnitName>New york</stateUnitName>
            <countryName>USA</countryName>
          </additionalData>
          <phoneList>
            <phoneNumber>11 5544334</phoneNumber>
			<phoneNumber>11 5544222</phoneNumber>
          </phoneList>
        <birthDate>dd/mm/yyyy</birthDate>
        <document>[CPF removido]</document>
        <email>[email removido]</email>
    </personData>

Para tanto você precisa usar Implicit Collections

public class Person {
   List<PhoneList> phones;

public class PhoneList {  
    private String phoneNumber;
}

e usar no teu XStream

xstream.addImplicitCollection(PhoneList.class, "phones", "phoneNumber", String.class);

algo assim, não testei…

valeu

Flavio_Luiz

Kra fiz o que você sugeriu… Mas ta dando erro…

Exception in thread main com.thoughtworks.xstream.InitializationException: No field phoneList for implicit collection

at com.thoughtworks.xstream.mapper.ImplicitCollectionMapper.add(ImplicitCollectionMapper.java:108)

at com.thoughtworks.xstream.XStream.addImplicitCollection(XStream.java:1311)

at directory.main.Teste.main(Teste.java:21)
Flavio_Luiz

Ai pessoal Consegui… vlw pela atenção e ajuda…
esse mapeamento resolveu o problema

XStream xstream = new XStream(new DomDriver());
	xstream.alias("personData", Person.class); 		
        xstream.alias("phoneList", List.class);
        xstream.alias("phoneNumber", String.class);
Criado 11 de dezembro de 2009
Ultima resposta 14 de dez. de 2009
Respostas 7
Participantes 3