Problemas ao Utilizar array de Strings no Xstream

2 respostas
N

Tenho o seguinte XML de exemplo que tenho interesse de tratar utilizando o XStream:

Obs: Não fiquei fazendo alias para os nomes dos tipos e colunas, é bem genérico para reproduzir a situação

<Elemento>
	<A>4DAF2BBB410393C0</A>
	<b>
		<a>valorA</a>
		<b>valorB</b>
		<c>valorC</c>
		<d>valorD</d>
	</b>
	<TipoC>
		<x>2</x>
		<y>Y</y>
		<y>T</y>
		<y>N</y>
		<y>B</y>
		<z>7</z>
		<z>7</z>
		<z>7</z>
		<z>7</z>
		<w>H</w>
	</TipoC>
	<TipoC>
		<x>4</x>
		<y>Y</y>
		<y>T</y>
		<y>N</y>
		<y>B</y>
		<z>7</z>
		<z>7</z>
		<z>7</z>
		<z>7</z>
		<w>O</w>
	</TipoC>
</Elemento>

Para trata-lo. Criei os beans abaixo:

package guj;

public class Elemento {

	private String A;
	private TipoB  b;
	private TipoC[] c;
	//getters and setters
	
}
package guj;

public class TipoB {

	private String a;
	private String b;
	private String c;
	private String d;
	//getters and setters
}
package guj;

public class TipoC {
	
	private String   x;
	private String[] y;
	private String[] z;
	private String   w;
	//getters and setters

}

E gerei a classe principal de teste conforme abaixo:

package guj;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class Test {

	public static void main(String[] args) {

		XStream xstream = new XStream(new DomDriver()); 
		
		// testar criação
		TipoC c1 = new TipoC();
		TipoC c2 = new TipoC();
		TipoB b = new TipoB();
		
		Elemento elem = new Elemento();
		
		// TipoC1
		c1.setX("2");
		c1.setY(new String[]{"Y","T","N","B"});
		c1.setZ(new String[]{"7","7","7","7"});
		c1.setW("H");

		//TipoC2
		c2.setX("4");
		c2.setY(new String[]{"Y","T","N","B"});
		c2.setZ(new String[]{"7","7","7","7"});
		c2.setW("O");

		b.setA("valorA");
		b.setB("valorB");
		b.setC("valorC");
		b.setD("valorD");
		
		elem.setA("4DAF2BBB410393C0");
		elem.setB(b);
		elem.setC(new TipoC[]{c1, c2});
		
		System.out.println(xstream.toXML(elem));

	}

}

O resultado foi o seguinte XML:

<guj.Elemento>
  <A>4DAF2BBB410393C0</A>
  <b>
    <a>valorA</a>
    <b>valorB</b>
    <c>valorC</c>
    <d>valorD</d>
  </b>
  <c>
    <guj.TipoC>
      <x>2</x>
      <y>
        <string>Y</string>
        <string>T</string>
        <string>N</string>
        <string>B</string>
      </y>
      <z>
        <string>7</string>
        <string>7</string>
        <string>7</string>
        <string>7</string>
      </z>
      <w>H</w>
    </guj.TipoC>
    <guj.TipoC>
      <x>4</x>
      <y>
        <string>Y</string>
        <string>T</string>
        <string>N</string>
        <string>B</string>
      </y>
      <z>
        <string>7</string>
        <string>7</string>
        <string>7</string>
        <string>7</string>
      </z>
      <w>O</w>
    </guj.TipoC>
  </c>
</guj.Elemento>

Notem que comparando com a idéia original, ele falhou na geração dos arrays. A lib criou uma Tag "C" para colocar os elementos C dentro dele quando na verdade cada C deveria vir diretamente abaixo sem a necessidade de outra TAG.
O atributo Y e Z do TipoC também sofrem problema semelhante. Ele abre a tag respectiva e coloca cada String dentro dela. Eu queria que fosse feito diversas tags com o mesmo nome.

Alguém sabe o que fiz errado. Será necessário o uso dos "converters" para essa situação?

Agradeço qualquer ajuda.

2 Respostas

peczenyj

Sim, mas é facinho.

basta criar os aliases e conversores

N

Conhece onde posso encontrar algum exemplo. O do site oficial é bem básico utilizando um bean com um atributo. E outro caso com mais atributos mas nada como essa situação.
O caso “real” possui até mesmo uma tag (atributo) no “TipoC” (do exemplo) que não seria obrigatório aparecer quando utiliza-se o método FromXML…

Criado 7 de agosto de 2008
Ultima resposta 7 de ago. de 2008
Respostas 2
Participantes 2