第一次使用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建立三个类
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节点的原因。。。而且最后发现这个接口实在是没什么用,局限性太多了,于是又放弃了使用这个接口。。。
当然出现这些问题可能只是个人理解问题和操作问题,但起码这样是可以达到我的目的的,如果有不对之处欢迎指正!