用一個例子來說明,例如這個http://video.sina.com.cn/v/b/75314002-1648211320.html。
用火狐打開,開啟firebug,得到以下資訊。
其中在這個請求
http://v.iask.com/v_play.php?vid=75314002&uid=1648211320&pid=478&tid=&plid=4001&prid=ja_7_3485822616&referrer=&ran=0.293680.com
中得到的回應有我們想要的xml訊息,其中vid就是上面紅色部分,uid後面的都可以忽略,我們在瀏覽器中直接輸入http://v.iask.com/v_play.php?vid=75314002還是可以得到相同的訊息。自此解析的想法就變清晰了,在視訊連結中提取出vid,使用http://v.iask.com/v_play.php?vid=得到xml文件,解析xml文件就可以得到真實視頻地址了。
下面的是解析xml的程式碼,使用sax解析xml。首先定義xml reader。
複製代碼代碼如下:
package hdu.fang.parser;
import hdu.fang.model.Video;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLSaxReader extends DefaultHandler {
private List<Video> videos = null;
private Video video = null;
private Long timeLength = null;
private String tag = null;
@Override
public void startDocument() throws SAXException {
videos = new ArrayList<Video>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("durl".equals(qName)) {
video = new Video();
}
tag = qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("durl".equals(qName)) {
videos.add(video);
video = null;
}
tag = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (tag != null) {
String data = new String(ch, start, length);
if ("timelength".equals(tag)) {
timeLength = Long.valueOf(data);
} else if ("order".equals(tag)) {
video.setOrder(Integer.valueOf(data));
} else if ("url".equals(tag)) {
video.setUrl(data);
} else if ("length".equals(tag)) {
video.setLength(Integer.valueOf(data));
}
}
}
public List<Video> getVideos() {
return videos;
}
public long getLength() {
return timeLength;
}
}
Video類別是我自己定義的一個資料model。在主函數裡我們只要呼叫sax工廠實例化解析器就行了。
複製代碼代碼如下:
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
XMLSaxReader reader = new XMLSaxReader();
InputStream in_withcode = new ByteArrayInputStream(
xml.getBytes("UTF-8"));//xml就是剛拿到的xml文件,型別String
sp.parse(in_withcode, reader);
videos=reader.getVideos();//得到Video List
timeLength=reader.getLength();//得到視訊長度
System.out.println(videos);
在xml檔裡還有很多其他訊息,都可以解析出來,看自己需要了。