package com.lq.util;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
/**
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class LyricXMLParser {
private static final String TAG = "LyricXMLParser";
private final String ELEMENT_COUNT = "count";
private final String ELEMENT_LRCID = "lrcid";
public int parseLyricId(InputStream is) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance(); // 取得SAXParserFactory实例
SAXParser parser = factory.newSAXParser(); // 从factory获取SAXParser实例
MyHandler handler = new MyHandler(); // 实例化自定义Handler
parser.parse(is, handler); // 根据自定义Handler规则解析输入流
is.close();
return handler.getFirstLyricId();
}
class MyHandler extends DefaultHandler {
private int mSongCount = 0;
private ArrayList<Integer> mLyricIds = new ArrayList<Integer>();
private StringBuilder mStringBuilder = new StringBuilder();;
public int getSongCount() {
return mSongCount;
}
// 若解析出多个lyricID,只返回第一个
public int getFirstLyricId() {
if (mSongCount == 0) {
return -1;
} else {
return mLyricIds.get(0);
}
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
mLyricIds.clear();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
mStringBuilder.setLength(0); // 将字符长度设置为0 以便重新开始读取元素内的字符节点
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if (localName.equals(ELEMENT_COUNT)) {
mSongCount = Integer.valueOf(mStringBuilder.toString());
Log.i(TAG, "解析出的匹配歌曲数目:" + mSongCount);
}
if (localName.equals(ELEMENT_LRCID)) {
Log.i(TAG, "歌词下载id:" + mStringBuilder.toString());
mLyricIds.add(Integer.valueOf(mStringBuilder.toString()));
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
mStringBuilder.append(ch, start, length); // 将读取的字符数组追加到builder中
}
}
}