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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XStream库实现XML与对象之间的互转可以通过以下步骤完成: 1. 引入XStream库的依赖:在你的项目中引入XStream库的依赖,可以参考我之前提供的Maven和Gradle配置。 2. 定义Java类:创建一个Java类来表示你的对象,并使用XStream提供的注解来指定XML元素和属性与Java类的映射关系。例如: ```java import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("person") public class Person { private String name; private int age; // 省略构造函数、getter和setter方法 // ... } ``` 3. 将对象转换为XML使用XStream将Java对象转换为XML字符串。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // 创建一个Person对象 Person person = new Person(); person.setName("John"); person.setAge(30); // 将Person对象转换为XML字符串 String xml = xStream.toXML(person); // 输出XML字符串 System.out.println(xml); } } ``` 以上代码将输出以下XML字符串: ```xml <person> <name>John</name> <age>30</age> </person> ``` 4. 将XML转换为对象:使用XStreamXML字符串转换回Java对象。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // XML字符串 String xml = "<person><name>John</name><age>30</age></person>"; // 将XML转换为Person对象 Person person = (Person) xStream.fromXML(xml); // 输出Person对象的属性 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } } ``` 以上代码将输出: ``` Name: John Age: 30 ``` 通过以上步骤,你可以使用XStream实现XML与对象之间的互转。你可以根据具体的需求对Java类和XML结构进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值