zoukankan      html  css  js  c++  java
  • 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节点的原因。。。而且最后发现这个接口实在是没什么用,局限性太多了,于是又放弃了使用这个接口。。。

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

  • 相关阅读:
    04-Go语言之运算符
    02-Go语言之变量和常量
    idea 无法加载识别本地类
    阿里云OSS实践篇
    jemeter 压测入门篇(附带工具)
    SpringBoot 中的那些“开关”
    java8 新特性之4大函数式接口
    java8 新特性之optional
    VSCode vue开发前配置
    前端架构演进及主流UI
  • 原文地址:https://www.cnblogs.com/blairsProgrammer/p/3489836.html
Copyright © 2011-2022 走看看