Criar XML a partir de String... Content is not allowed in prolog

Galera,

estou recebendo uma String de retorno de um WebService.

Esta String, obviamente, vem em formato XML.

Estou querendo criar objetos a partir deste retorno, mas só tá dando erro!

Pensei a seguinte maneira:

Pego a String, transformo em XML, e a partir do XML crio uma Lista de OrdemServico.

Segue o Código:

public List<OrdemServico> recebeGetData(final String xml){

        //stream.alias("transicao", OrdemServico.class);
        stream.autodetectAnnotations(true);
        stream.processAnnotations(OrdemServico.class);

        System.out.println("Retorno: " + integrador.getData(idEmpresa, dsLogin, dsSenha, xml));

        InputStream is = new ByteArrayInputStream( integrador.getData(idEmpresa, dsLogin, dsSenha, xml).getBytes() );

        return (List<OrdemServico>) stream.fromXML( is );

    }

e a Classe OrdemServico

@XStreamAlias("transicao")
public class OrdemServico {

    private String tipoOrdemServico        = "";
    private String ordemServico            = "";
    private String sincronizadaDispositivo = "";
    private String statusOrdemServico      = "";
    private String data                    = "";
    private String hora                    = "";
    
    private Calendario calendario = new Calendario();



    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getHora() {
        return hora;
    }

    public void setHora(String hora) {
        this.hora = hora;
    }

    public String getOrdemServico() {
        return ordemServico;
    }

    public void setOrdemServico(String ordemServico) {
        this.ordemServico = ordemServico;
    }

    public String getSincronizadaDispositivo() {
        return sincronizadaDispositivo;
    }

    public void setSincronizadaDispositivo(String sincronizadaDispositivo) {
        this.sincronizadaDispositivo = sincronizadaDispositivo;

        setData( calendario.extrairDataHora(sincronizadaDispositivo)[0] );
        setHora( calendario.extrairDataHora(sincronizadaDispositivo)[1] );

    }

    public String getStatusOrdemServico() {
        return statusOrdemServico;
    }

    public void setStatusOrdemServico(String statusOrdemServico) {
        this.statusOrdemServico = statusOrdemServico;
    }

    public String getTipoOrdemServico() {
        return tipoOrdemServico;
    }

    public void setTipoOrdemServico(String tipoOrdemServico) {
        this.tipoOrdemServico = tipoOrdemServico;
    }

o XML é este:

<retorno xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="3983347" xmlns="http://www.osmobile.com.br">
  <conexao>
    <empresa>77</empresa>
    <usuario>telefonica1</usuario>
    <eventos>
      <evento>
        <tipo>OK</tipo>
        <mensagem>Conectado</mensagem>
        <dataHora>2009-02-19T16:37:13.84375-03:00</dataHora>
      </evento>
    </eventos>
  </conexao>
  <processamento>
    <validacaoXml>
      <eventos>
        <evento>
          <tipo>OK</tipo>
          <mensagem>Validado</mensagem>
          <dataHora>2009-02-19T16:37:13.84375-03:00</dataHora>
        </evento>
      </eventos>
    </validacaoXml>
    <transicoes>
      <transicao id="10257302">
        <empresa>77</empresa>
        <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico>
        <ordemServico>OC5</ordemServico>
        <status>Executada</status>
        <nome>SINCRONIZADA</nome>
        <usuario>cleber</usuario>
        <habilitada>2008-11-25T18:11:16.993-03:00</habilitada>
        <executada>2008-11-25T18:11:16.993-03:00</executada>
        <sincronizadaServidor>2008-11-25T18:11:16.563-03:00</sincronizadaServidor>
        <sincronizadaDispositivo>2008-11-25T17:12:08.993-03:00</sincronizadaDispositivo>
        <statusOrdemServico>Sincronizada</statusOrdemServico>
      </transicao>
      <transicao id="10257327">
        <empresa>77</empresa>
        <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico>
        <ordemServico>OC5</ordemServico>
        <status>Executada</status>
        <nome>LIDA</nome>
        <usuario>cleber</usuario>
        <habilitada>2008-11-25T18:11:21.723-03:00</habilitada>
        <executada>2008-11-25T18:11:21.723-03:00</executada>
        <sincronizadaServidor>2008-11-25T18:12:00.843-03:00</sincronizadaServidor>
        <sincronizadaDispositivo>2008-11-25T17:12:53.27-03:00</sincronizadaDispositivo>
        <statusOrdemServico>Lida</statusOrdemServico>
      </transicao>
      <transicao id="10257345">
        <empresa>77</empresa>
        <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico>
        <ordemServico>OC5</ordemServico>
        <status>Executada</status>
        <nome>FIM</nome>
        <usuario>cleber</usuario>
        <habilitada>2008-11-25T18:12:34.567-03:00</habilitada>
        <executada>2008-11-25T18:12:34.567-03:00</executada>
        <sincronizadaServidor>2008-11-25T18:12:37.907-03:00</sincronizadaServidor>
        <sincronizadaDispositivo>2008-11-25T17:13:24.73-03:00</sincronizadaDispositivo>
        <statusOrdemServico>Finalizada</statusOrdemServico>
      </transicao>
      <transicao id="10257342">
        <empresa>77</empresa>
        <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico>
        <ordemServico>OC5</ordemServico>
        <status>Executada</status>
        <nome>Imagem1</nome>
        <usuario>cleber</usuario>
        <habilitada>2008-11-25T18:11:23.46-03:00</habilitada>
        <executada>2008-11-25T18:12:34.567-03:00</executada>
        <sincronizadaServidor>2008-11-25T18:12:37.907-03:00</sincronizadaServidor>
        <sincronizadaDispositivo>2008-11-25T17:13:24.73-03:00</sincronizadaDispositivo>
        <statusOrdemServico>Ativa</statusOrdemServico>
        <variaveis>
          <variavel nome="imagem1">
            <valor>Imagem anexada ao repositório.</valor>
          </variavel>
        </variaveis>
      </transicao>
    </transicoes>
    <eventos />
  </processamento>
  <eventos />
</retorno>

Alguém poderia me ajudar??

Ah…

o erro que dá é este:

[Fatal Error] :1:40: Content is not allowed in prolog.
com.thoughtworks.xstream.io.StreamException:  : Content is not allowed in prolog.
        at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86)
        at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:70)
        at com.thoughtworks.xstream.XStream.fromXML(XStream.java:869)
        at mxtelefonica.webservice.RecebeGetData.recebeGetData(RecebeGetData.java:33)
        at mxtelefonica.main.mainClass.main(mainClass.java:57)
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
        at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:79)

Ninguém??

Eu alterei minha xml, de utf-16 para utf-8.

No forum da SUN eles falaram que resolvia, porém,

agora o erro que me dá é no xml:

com.thoughtworks.xstream.io.StreamException:  : Invalid byte 2 of 4-byte UTF-8 sequence.
        at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:88)
        at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:70)
        at com.thoughtworks.xstream.XStream.fromXML(XStream.java:869)
        at mxtelefonica.webservice.RecebeGetData.recebeGetData(RecebeGetData.java:35)
        at mxtelefonica.main.mainClass.main(mainClass.java:178)
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:674)
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:463)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(XMLEntityScanner.java:1416)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
        at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:79)
        ... 4 more

Tudo bem você ter especificado utf-8, mas o conteúdo mandado é utf-8?

Seu xml deveria comecar mais ou menos assim…

<?xml version='1.0' encoding='UTF-8'?>

bom naum ficou bonito pq naum uso anotação em xstream para poder reaproveitar as classes em outros mapeamentos xml…
eu realmente nunca testei passar uma classe que representa algo dentro do xml creio que temos que fazer toda a arvore em classes, como acho que isso foi preguiça de fazer classes fiz uma só mas com innerClass hehehe… funciona!!

[code]import com.thoughtworks.xstream.XStream;

public class VamosVer {

/**
 * @param args
 */
public static void main(String[] args) {
	XStream xs = new XStream();
	
	xs.alias("retorno", Retorno.class);
	xs.alias("processamento", Retorno.Processamento.class);
	xs.alias("transicao", Retorno.Processamento.OrdemServico.class);
	xs.omitField(Retorno.class, "conexao");
	xs.omitField(Retorno.Processamento.class, "validacaoXml");
	xs.omitField(Retorno.class, "eventos");
	xs.omitField(Retorno.Processamento.class, "eventos");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "empresa");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "status");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "nome");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "usuario");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "habilitada");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "executada");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "sincronizadaServidor");
	xs.omitField(Retorno.Processamento.OrdemServico.class, "variaveis");
	
	Retorno retorno = (Retorno)xs.fromXML(VamosVer.class.getResourceAsStream("retorno.xml"));
	System.out.println(xs.toXML(retorno.getOrdemServicoList()));

}

}
[/code]

[code]import java.util.List;

public class Retorno {
private Processamento processamento;

public Processamento getProcessamento() {
	return processamento;
}

public void setProcessamento(Processamento processamento) {
	this.processamento = processamento;
}

public List<Retorno.Processamento.OrdemServico> getOrdemServicoList(){
	return processamento.getTransicoes();
}


//cuidado innerClass
public class Processamento {

	private List<OrdemServico> transicoes;
	
	public List<OrdemServico> getTransicoes() {
		return transicoes;
	}

	public void setTransicoes(List<OrdemServico> transicoes) {
		this.transicoes = transicoes;
	}
	
	
	//cuidado innerClass da innerClass
	public class OrdemServico {
		
		private String tipoOrdemServico;
		private String ordemServico;
		private String sincronizadaDispositivo;
		private String statusOrdemServico;
		private String data;
		private String hora;
		
		public String getTipoOrdemServico() {
			return tipoOrdemServico;
		}
		public void setTipoOrdemServico(String tipoOrdemServico) {
			this.tipoOrdemServico = tipoOrdemServico;
		}
		public String getOrdemServico() {
			return ordemServico;
		}
		public void setOrdemServico(String ordemServico) {
			this.ordemServico = ordemServico;
		}
		public String getSincronizadaDispositivo() {
			return sincronizadaDispositivo;
		}
		public void setSincronizadaDispositivo(String sincronizadaDispositivo) {
			this.sincronizadaDispositivo = sincronizadaDispositivo;
		}
		public String getStatusOrdemServico() {
			return statusOrdemServico;
		}
		public void setStatusOrdemServico(String statusOrdemServico) {
			this.statusOrdemServico = statusOrdemServico;
		}
		public String getData() {
			return data;
		}
		public void setData(String data) {
			this.data = data;
		}
		public String getHora() {
			return hora;
		}
		public void setHora(String hora) {
			this.hora = hora;
		}
	}
}

}
[/code]

<?xml version="1.0" encoding="UTF-8"?> <retorno xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="3983347" xmlns="http://www.osmobile.com.br"> <conexao> <empresa>77</empresa> <usuario>telefonica1</usuario> <eventos> <evento> <tipo>OK</tipo> <mensagem>Conectado</mensagem> <dataHora>2009-02-19T16:37:13.84375-03:00</dataHora> </evento> </eventos> </conexao> <processamento> <validacaoXml> <eventos> <evento> <tipo>OK</tipo> <mensagem>Validado</mensagem> <dataHora>2009-02-19T16:37:13.84375-03:00</dataHora> </evento> </eventos> </validacaoXml> <transicoes> <transicao id="10257302"> <empresa>77</empresa> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <status>Executada</status> <nome>SINCRONIZADA</nome> <usuario>cleber</usuario> <habilitada>2008-11-25T18:11:16.993-03:00</habilitada> <executada>2008-11-25T18:11:16.993-03:00</executada> <sincronizadaServidor>2008-11-25T18:11:16.563-03:00</sincronizadaServidor> <sincronizadaDispositivo>2008-11-25T17:12:08.993-03:00</sincronizadaDispositivo> <statusOrdemServico>Sincronizada</statusOrdemServico> </transicao> <transicao id="10257327"> <empresa>77</empresa> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <status>Executada</status> <nome>LIDA</nome> <usuario>cleber</usuario> <habilitada>2008-11-25T18:11:21.723-03:00</habilitada> <executada>2008-11-25T18:11:21.723-03:00</executada> <sincronizadaServidor>2008-11-25T18:12:00.843-03:00</sincronizadaServidor> <sincronizadaDispositivo>2008-11-25T17:12:53.27-03:00</sincronizadaDispositivo> <statusOrdemServico>Lida</statusOrdemServico> </transicao> <transicao id="10257345"> <empresa>77</empresa> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <status>Executada</status> <nome>FIM</nome> <usuario>cleber</usuario> <habilitada>2008-11-25T18:12:34.567-03:00</habilitada> <executada>2008-11-25T18:12:34.567-03:00</executada> <sincronizadaServidor>2008-11-25T18:12:37.907-03:00</sincronizadaServidor> <sincronizadaDispositivo>2008-11-25T17:13:24.73-03:00</sincronizadaDispositivo> <statusOrdemServico>Finalizada</statusOrdemServico> </transicao> <transicao id="10257342"> <empresa>77</empresa> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <status>Executada</status> <nome>Imagem1</nome> <usuario>cleber</usuario> <habilitada>2008-11-25T18:11:23.46-03:00</habilitada> <executada>2008-11-25T18:12:34.567-03:00</executada> <sincronizadaServidor>2008-11-25T18:12:37.907-03:00</sincronizadaServidor> <sincronizadaDispositivo>2008-11-25T17:13:24.73-03:00</sincronizadaDispositivo> <statusOrdemServico>Ativa</statusOrdemServico> <variaveis> <variavel nome="imagem1"> <valor>Imagem anexada ao repositório.</valor> </variavel> </variaveis> </transicao> </transicoes> <eventos /> </processamento> <eventos /> </retorno>

resultado no output

<list> <transicao> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <sincronizadaDispositivo>2008-11-25T17:12:08.993-03:00</sincronizadaDispositivo> <statusOrdemServico>Sincronizada</statusOrdemServico> </transicao> <transicao> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <sincronizadaDispositivo>2008-11-25T17:12:53.27-03:00</sincronizadaDispositivo> <statusOrdemServico>Lida</statusOrdemServico> </transicao> <transicao> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <sincronizadaDispositivo>2008-11-25T17:13:24.73-03:00</sincronizadaDispositivo> <statusOrdemServico>Finalizada</statusOrdemServico> </transicao> <transicao> <tipoOrdemServico>Net SP Cop Rede Fluxo1_COPIADO</tipoOrdemServico> <ordemServico>OC5</ordemServico> <sincronizadaDispositivo>2008-11-25T17:13:24.73-03:00</sincronizadaDispositivo> <statusOrdemServico>Ativa</statusOrdemServico> </transicao> </list>

Porra nextuser…

valeu!!! =)

Vou testar aqui…

Porém tenho que criar todas estas classes mesmo se eu não for utilizar nenhuma delas?

como disse creio que sim!! ele ja reclama quando tem um elemento que nuam está sendo tratado por isso dos omitField mas se for exatamente isso que vc precisa pode usar a classe que fiz com inner class

Demoro !

Vo usar a classe e vo fazendo uns testes pra ver até onde posso alterar…

cara… brigadao mesmo!!!