android下使用xstream解析百度音乐接口

第一次使用xstream,感觉这个东西挺奇怪的,不知是它蠢还是我蠢。。

首先是接口地址,http://box.zhangmen.baidu.com/x?op=12&count=1&title=歌名$$歌手名$$$$

 

在这个链接http://blog.csdn.net/hepershade/article/details/7462434有解释返回的xml数据分别代表啥,我就不另外说了,反正就是百度来一堆的,现在主要是讲android下怎么使用xstream来解析这东西,算是比较有针对性的了,因为折腾了我比较久,我也刚接触android没多长时间,所以还是出现很多问题,特记录下来。

首先是根据返回的xml建立三个类

QQ截图20131224224510

package com.jlmusicplayer.domain;

import java.util.ArrayList;
import java.util.List;

public class result {

    private int count;
     
    private List<url> urlList=new ArrayList<url>();

    private List<durl> durlList=new ArrayList<durl>();
    
    private p2p p2p;
    
    public String toString(){
        String s="";
        s+="count="+count;
        if(urlList!=null)
        for(int i=0;i<urlList.size();i++){
            url u=(url) urlList.get(i);
            s+="第一个url是:"+u.getEncode();
        }
        s+="____p2p是:"+p2p.getHash()+p2p.getSize()+"______"+p2p.getType();
        return s;
        
    }
    public p2p getP2p() {
        return p2p;
    }



    public void setP2p(p2p p2p) {
        this.p2p = p2p;
    }



    public int getCount() {
        return count;
    }



    public void setCount(int count) {
        this.count = count;
    }



    public List<url> getUrlList() {
        return urlList;
    }



    public void setUrlList(List<url> urlList) {
        this.urlList = urlList;
    }



    public List<durl> getDurlList() {
        return durlList;
    }



    public void setDurlList(List<durl> durlList) {
        this.durlList = durlList;
    }




}

 

里面的durl其实是没用的,然后tostring是我用来输出内容自己写的一个方法,可以不要~getset貌似也是可以不要的,但是写习惯了,有兴趣的可以自己去试一下。。

package com.jlmusicplayer.domain;

public class url {
    private String encode;
    private String decode;
    private int type;
    private int lrcid;
    private int flag;

    public String getEncode() {
        return encode;
    }
    public void setEncode(String encode) {
        this.encode = encode;
    }
    public String getDecode() {
        return decode;
    }
    public void setDecode(String decode) {
        this.decode = decode;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public int getLrcid() {
        return lrcid;
    }
    public void setLrcid(int lrcid) {
        this.lrcid = lrcid;
    }
    public int getFlag() {
        return flag;
    }
    public void setFlag(int flag) {
        this.flag = flag;
    }
}
package com.jlmusicplayer.domain;

public class durl {
    private String encode;
    private String decode;
    private int type;
    private int lrcid;
    private int flag;
    public String getEncode() {
        return encode;
    }
    public void setEncode(String encode) {
        this.encode = encode;
    }
    public String getDecode() {
        return decode;
    }
    public void setDecode(String decode) {
        this.decode = decode;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public int getLrcid() {
        return lrcid;
    }
    public void setLrcid(int lrcid) {
        this.lrcid = lrcid;
    }
    public int getFlag() {
        return flag;
    }
    public void setFlag(int flag) {
        this.flag = flag;
    }
}
package com.jlmusicplayer.domain;

public class p2p {
    public String getHash() {
        return hash;
    }
    public void setHash(String hash) {
        this.hash = hash;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public int getBitrate() {
        return bitrate;
    }
    public void setBitrate(int bitrate) {
        this.bitrate = bitrate;
    }
    private String hash;
    private String url;
    private String type;
    private int size;
    private int bitrate;
}

 

大家仔细看返回的xml可以知道那里的url和durl是一样的东西,只是“url”和“durl”的名字不同而已,具体代表什么我没仔细研究,本文只记载如何获取数据。

package com.yeung.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpUtil {
    public static String BAIDU_BASE_API="http://box.zhangmen.baidu.com/x?op=12&count=1&title=";
    
    public  static String getBaiduMusicInfo(String tourl) throws IOException{
        HttpClient client=new DefaultHttpClient();
        StringBuilder builder=new StringBuilder();
        HttpGet get =new HttpGet(tourl);
        HttpResponse response=client.execute(get);
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent()));
        for(String s= reader.readLine();s!=null;s=reader.readLine()){
            builder.append(s);
        }
        return builder.toString();
    }
}

 

连接地址,以string类型返回xml内容,这里的地址为了方便我去掉了歌手的那一段,实测一样可以搜索到歌曲,只是精度没那么高吧。

try {
                    musicName_show=musicName;
                    musicName = URLEncoder.encode(musicName, "UTF-8");
                    //singerName = URLEncoder.encode(singerName, "UTF-8");
                } catch (UnsupportedEncodingException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                tourl=HttpUtil.BAIDU_BASE_API+musicName+"$$";
                xstream = new XStream(new DomDriver("UTF-8"));
                xstream.alias("result", result.class);
                xstream.alias("url", url.class);
                xstream.alias("durl", url.class);
                xstream.alias("p2p", p2p.class);
                xstream.addImplicitCollection(result.class, "urlList");
                //xstream.addImplicitCollection(result.class, "durlList");
                r=new result();
                Thread t=new Thread(new Runnable(){
                        @Override
                        public void run() {
                            try {
                                System.out.println("内容先给我看看"+HttpUtil.getBaiduMusicInfo(tourl));
                                r=(result)xstream.fromXML(HttpUtil.getBaiduMusicInfo(tourl));
                                handler.post(runnableUi);     //发送信息到handler更新线程
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                System.out.println("先看看错误嘛"+e);
                            }
                            }
                    });
                    t.start();

            }
            
        });

这里就是主体代码啦。有几点要注意的是

1、因为百度音乐接口返回的xml是省略了list节点的,所以只看到一堆的<url>而没有<urlList>,但我们还是要将其当arraylist来处理,但必须要添加xstream.addImplicitCollection(result.class, "urlList"); 否则会提示找不到url/encode类

2、百度接口里有url和durl,两个只是名字不同但内容一样,而转换到javabean的时候,居然会直接无视durl而将xml里的url和durl都塞进javabean的url类里!!!这个问题很郁闷,也是在我输出arraylist<url>的时候发现的,一直提示durl cannot cast to url!!!,但是将这个bean再转换为xml发现是正常的。。。此时我推断是硬生生将durl也塞进url里了。。所以这里要这样:xstream.alias("durl", url.class); 直接手动将durl塞进url里(到了这一步也就明白为什么上面说的durl是没用的了)

 

以上就是整个使用xstream获取百度音乐接口xml的流程,咋一看挺简单,但花了我好多时间。。。都是因为百度省略了urllist节点的原因。。。而且最后发现这个接口实在是没什么用,局限性太多了,于是又放弃了使用这个接口。。。

当然出现这些问题可能只是个人理解问题和操作问题,但起码这样是可以达到我的目的的,如果有不对之处欢迎指正!

posted @ 2013-12-24 23:05  不想换名了  阅读(474)  评论(0编辑  收藏  举报