Jump to content
sh4rk23

Serviço Web em Java - Tratar string em XML

Recommended Posts

sh4rk23

Boas pessoal...

Estou a tentar utilizar um WebService da sapo, que me permita obter a descrição de programação dos canais de televisão assim como a descrição dos respectivos canais. O código do serviço do servidor e respectivos métodos podem ser consultados  aqui: http://services.sapo.pt/CodeGeneration/Java?wsdlUrl=http://services.sapo.pt/Metadata/Contract/EPG&culture=PT.

Adiante, no cliente implementei o seguinte código:

import java.io.*;
import pt.sapo.services.metadata.epg.*;

public class SapoEPGClient {

    public static void main(String args[]) throws IOException {


	try {
		pt.sapo.services.metadata.epg.EPG service = new pt.sapo.services.metadata.epg.EPG();
		pt.sapo.services.metadata.epg.EPGSoap port = service.getEPGSoap();
		 // TODO initialize WS operation arguments here
		java.lang.String channelSigla = "SIC";
		// TODO process result here
		pt.sapo.services.metadata.epg.Channel result = port.getChannelDetail(channelSigla);

		System.out.println("Result = "+result);

	} catch (Exception ex) {
		System.out.println(ex);
       
    }

    }
}

Partindo do principio que implementei bem o cliente web para obter a descrição do canal SIC, quando executo o cliente o resultado do println é o seguinte:

Result = pt.sapo.services.metadata.epg.Channel@6c1a82

ou seja, um conjunto de caracteres que não possui a informação pretendida, que deveria ser esta:

<GetChannelDetailResponse>
−
<GetChannelDetailResult>
<Name>SIC</Name>
<Sigla>SIC</Sigla>
<Type/>
<Providers>
<Provider>
<Name>MEO</Name>
</Provider>
</Providers>
<Programs/>
</GetChannelDetailResult>
</GetChannelDetailResponse>

Sendo que o serviço da sapo retorna os dados em XML, eu suspeito que a string que obtenho tem de ser tratada de forma a interpretar os dados XML.

Estarei correcto?

Se assim for, gostaria de saber se alguém me poderia ajudar em como tratar a stream de dados em XML visto que nunca trabalhei com XML em java nem em nenhuma aplicação.

Caso esteja a implementar o cliente do serviço web de forma incorrecta também aceito sugestões.

Se alguém me conseguir ajudar agradeço.

:D

Share this post


Link to post
Share on other sites
magician

Errado ele não retorna uma String mas sim um Object Channel nesse caso, que é a representação do XML em objecto Java. Depois de teres esse result é só fazeres o get do que queres.


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
sh4rk23

Errado ele não retorna uma String mas sim um Object Channel nesse caso, que é a representação do XML em objecto Java. Depois de teres esse result é só fazeres o get do que queres.

Assim já faz mais sentido, realmente estava a pensar que os dados vinham num stream. :nono1:

Contudo, surgiu-me outra dúvida. Eu pretendo obter a lista de todos os canis disponíveis através do código:

   try {
            pt.sapo.services.metadata.epg.EPG service = new pt.sapo.services.metadata.epg.EPG();
            pt.sapo.services.metadata.epg.EPGHttpGet port = service.getEPGHttpGet();
            // TODO initialize WS operation arguments here
            pt.sapo.services.metadata.epg.GetChannelList parameters = null;
            // TODO process result here
            pt.sapo.services.metadata.epg.GetChannelListResponse result = port.getChannelList(parameters);
            System.out.println("Result = " + result.getGetChannelListResult().getName());
        } catch (Exception ex) {
            // TODO handle custom exceptions here
        }

Que supostamente enviaria a lista de todos os canais disponíveis, sendo o seguinte código correspondente ao objecto GetChannelListResponse:


package pt.sapo.services.metadata.epg;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
* <p>Java class for anonymous complex type.
* 
* <p>The following schema fragment specifies the expected content contained within this class.
* 
* <pre>
* <complexType>
*   <complexContent>
*     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
*       <sequence>
*         <element name="GetChannelListResult" type="{http://services.sapo.pt/Metadata/EPG}ArrayOfChannel" minOccurs="0"/>
*       </sequence>
*     </restriction>
*   </complexContent>
* </complexType>
* </pre>
* 
* 
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "getChannelListResult"
})
@XmlRootElement(name = "GetChannelListResponse")
public class GetChannelListResponse {

    @XmlElementRef(name = "GetChannelListResult", namespace = "http://services.sapo.pt/Metadata/EPG", type = JAXBElement.class, required = false)
    protected JAXBElement<ArrayOfChannel> getChannelListResult;

    /**
     * Gets the value of the getChannelListResult property.
     * 
     * @return
     *     possible object is
     *     {@link JAXBElement }{@code <}{@link ArrayOfChannel }{@code >}
     *     
     */
    public JAXBElement<ArrayOfChannel> getGetChannelListResult() {
        return getChannelListResult;
    }

    /**
     * Sets the value of the getChannelListResult property.
     * 
     * @param value
     *     allowed object is
     *     {@link JAXBElement }{@code <}{@link ArrayOfChannel }{@code >}
     *     
     */
    public void setGetChannelListResult(JAXBElement<ArrayOfChannel> value) {
        this.getChannelListResult = ((JAXBElement<ArrayOfChannel> ) value);
    }

}

Ou seja, como é que eu obtenho a lista de canais um a um neste caso, sendo que é enviado uma lista com vários canais.

Em XML, e experimentando o serviço na web no site da sapo o serviço retorna-me algo do género:

<GetChannelListResponse>
−
<GetChannelListResult>
−
<Channel>
<Name>RTP 1</Name>
<Sigla>RTP1</Sigla>
<Type/>
−
<Providers>
−
<Provider>
<Name>MEO</Name>
</Provider>
</Providers>
<Programs/>
</Channel>
−
<Channel>
<Name>RTP2</Name>
<Sigla>RTP2</Sigla>
<Type/>
−
<Providers>
−
<Provider>
<Name>MEO</Name>
</Provider>
</Providers>
<Programs/>
</Channel>
−
<Channel>
...

Share this post


Link to post
Share on other sites
magician

Assim derrepente acho que será alto do tipo

result.getGetChannelListResult().getChannel();

public List<Channel> getChannel() {

        if (channel == null) {

            channel = new ArrayList<Channel>();

        }

        return this.channel;

}


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
sh4rk23

Acho que não estava a utilizar os métodos correctamente. Penso que já consegui fazer o que queria.

Segue um exemplo de código e respectivo output , caso alguém tenha a mesma dúvida que eu:

pt.sapo.services.metadata.epg.EPG service = new pt.sapo.services.metadata.epg.EPG();
pt.sapo.services.metadata.epg.EPGSoap port = service.getEPGSoap();
 // TODO initialize WS operation arguments here
java.lang.String channelSigla = "SIC";
java.lang.String startDate = "2011-03-31 14:15:12";
java.lang.String endDate = "2011-03-31 20:15:12";
// TODO process result here
pt.sapo.services.metadata.epg.ArrayOfProgram result = port.getProgramListByChannelDateInterval(channelSigla, startDate, endDate);

        int index = 0;

        while(result.getProgram().get(index)!=null)  {
             System.out.println("Título = "+result.getProgram().get(index).getTitle());
             System.out.println("Descrição = "+result.getProgram().get(index).getDescription());
             System.out.println("Start time = "+result.getProgram().get(index).getStartTime());
             System.out.println("Duração = "+result.getProgram().get(index).getDuration() + "\n");


             index++;
        }
    } catch (Exception ex) {
// TODO handle custom exceptions here
    }

Em que o output é:

Título = Primeiro Jornal
Descrição = Toda a actualidade sobre as principais notícias do dia.
Start time = 2011-03-31 13:00:00
Duração = 5400

Título = Alma Gémea - Ep. 62
Descrição = Serena diz que Luna é parte dela e que precisa descobrir qual é a sua missão. Elias diz que não pode ajudá-la porque pode ser muito doloroso para ela. Cristina assume que conhecia Guto e que errou ao não contar antes que ele e Serena estavam se encontrando.
Start time = 2011-03-31 14:30:00
Duração = 3600

Título = Boa Tarde T2 - Ep. 14
Descrição = O entretenimento chega todas as tardes, com Conceição Lino. A boa disposição desta apresentadora promete muita animação para começar a tarde da melhor forma.
Start time = 2011-03-31 15:30:00
Duração = 9900

Título = Ti Ti Ti - Ep. 69
Descrição = Desirée rompe com Armandinho e devolve o colar que ganhou. Julinho descobre que Eduardo tem uma namorada. Luisa comunica que vai passar um tempo fora do país. Ariclenes suspeita que Jacques lhe recomendou Gigi e diz a Chico que precisa se livrar dela.
Start time = 2011-03-31 18:15:00
Duração = 3600

Título = Escrito Nas Estrelas - Ep. 109
Descrição = Vitória/Viviane conversa com Daniel, acalmando seu espírito. Athael, Francisca e Seth se unem a Viviane e ficam satisfeitos quando Daniel se afasta. Jardel chantageia Dalva para ficar hospedado na casa dela. Ricardo agradece Jane por ter feito todo o procedimento de Vitória/Viviane.
Start time = 2011-03-31 19:15:00
Duração = 2700

Título = Jornal Da Noite
Descrição = Toda a actualidade sobre as principais notícias do dia.
Start time = 2011-03-31 20:00:00
Duração = 6000

Esta parte está feita. Embora sem a dica do magician não sei quanto tempo iria demorar a lá chegar.  Agora vou tentar passar os dados para uma DB.

Tanks  :)

Share this post


Link to post
Share on other sites
um.nelson

Boas sh4rk23.

Gostava de fazer uma aplicação como a que descreves-te me cima.

Mas a documentação sobre esse WebService já não se encontra online, ainda tens acesso a isso?

Obrigado

Share this post


Link to post
Share on other sites
mr.solrac007

Também queria criar uma app mas estou com problemas em interagir com o webservice.

Alguém sabe ou tem alguma coisa feita??

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.