/** * */ package com.iflytek.ise.result.xml; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.text.TextUtils; import android.util.Xml; import com.iflytek.ise.result.FinalResult; import com.iflytek.ise.result.ReadSentenceResult; import com.iflytek.ise.result.ReadSyllableResult; import com.iflytek.ise.result.ReadWordResult; import com.iflytek.ise.result.Result; import com.iflytek.ise.result.entity.Phone; import com.iflytek.ise.result.entity.Sentence; import com.iflytek.ise.result.entity.Syll; import com.iflytek.ise.result.entity.Word; /** * <p>Title: XmlResultParser</p> * <p>Description: </p> * <p>Company: www.iflytek.com</p> * @author iflytek * @date 2015年1月12日 下午5:21:53 */ public class XmlResultParser { public Result parse(String xml) { if (TextUtils.isEmpty(xml)) { return null; } XmlPullParser pullParser = Xml.newPullParser(); try { InputStream ins = new ByteArrayInputStream(xml.getBytes()); pullParser.setInput(ins, "utf-8"); FinalResult finalResult = null; int eventType = pullParser.getEventType(); while (XmlPullParser.END_DOCUMENT != eventType) { switch (eventType) { case XmlPullParser.START_TAG: if ("FinalResult".equals(pullParser.getName())) { // 只有一个总分的结果 finalResult = new FinalResult(); } else if ("ret".equals(pullParser.getName())) { finalResult.ret = getInt(pullParser, "value"); } else if ("total_score".equals(pullParser.getName())) { finalResult.total_score = getFloat(pullParser, "value"); } else if ("xml_result".equals(pullParser.getName())) { // 详细结果 return parseResult(pullParser); } break; case XmlPullParser.END_TAG: if ("FinalResult".equals(pullParser.getName())) { return finalResult; } break; default: break; } eventType = pullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } private Result parseResult(XmlPullParser pullParser) { Result result = null; // <rec_paper>标签是否已扫描到 boolean rec_paperPassed = false; Sentence sentence = null; Word word = null; Syll syll = null; Phone phone = null; int eventType; try { eventType = pullParser.getEventType(); while (XmlPullParser.END_DOCUMENT != eventType) { switch (eventType) { case XmlPullParser.START_TAG: if ("rec_paper".equals(pullParser.getName())) { rec_paperPassed = true; } else if ("read_syllable".equals(pullParser.getName())) { if (!rec_paperPassed) { result = new ReadSyllableResult(); } else { readTotalResult(result, pullParser); } } else if ("read_word".equals(pullParser.getName())) { if (!rec_paperPassed) { result = new ReadWordResult(); String lan = getLanguage(pullParser); result.language = (null == lan)? "cn": lan; } else { readTotalResult(result, pullParser); } } else if ("read_sentence".equals(pullParser.getName()) || "read_chapter".equals(pullParser.getName())) { if (!rec_paperPassed) { result = new ReadSentenceResult(); String lan = getLanguage(pullParser); result.language = (null == lan)? "cn": lan; } else { readTotalResult(result, pullParser); } } else if ("sentence".equals(pullParser.getName())) { if (null == result.sentences) { result.sentences = new ArrayList<Sentence>(); } sentence = createSentence(pullParser); } else if ("word".equals(pullParser.getName())) { if (null != sentence && null == sentence.words) { sentence.words = new ArrayList<Word>(); } word = createWord(pullParser); } else if ("syll".equals(pullParser.getName())) { if (null != word && null == word.sylls) { word.sylls = new ArrayList<Syll>(); } syll = createSyll(pullParser); } else if ("phone".equals(pullParser.getName())) { if (null != syll && null == syll.phones) { syll.phones = new ArrayList<Phone>(); } phone = createPhone(pullParser); } break; case XmlPullParser.END_TAG: if ("phone".equals(pullParser.getName())) { syll.phones.add(phone); } else if ("syll".equals(pullParser.getName())) { word.sylls.add(syll); } else if ("word".equals(pullParser.getName())) { sentence.words.add(word); } else if ("sentence".equals(pullParser.getName())) { result.sentences.add(sentence); } else if ("read_syllable".equals(pullParser.getName()) || "read_word".equals(pullParser.getName()) || "read_sentence".equals(pullParser.getName())) { return result; } break; default: break; } eventType = pullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } private void readTotalResult(Result result, XmlPullParser pullParser) { result.beg_pos = getInt(pullParser, "beg_pos"); result.end_pos = getInt(pullParser, "end_pos"); result.content = getContent(pullParser); result.total_score = getFloat(pullParser, "total_score"); result.time_len = getInt(pullParser, "time_len"); result.except_info = getExceptInfo(pullParser); result.is_rejected = getIsRejected(pullParser); } private Phone createPhone(XmlPullParser pullParser) { Phone phone; phone = new Phone(); phone.beg_pos = getInt(pullParser, "beg_pos"); phone.end_pos = getInt(pullParser, "end_pos"); phone.content = getContent(pullParser); phone.dp_message = getInt(pullParser, "dp_message"); phone.time_len = getInt(pullParser, "time_len"); return phone; } private Syll createSyll(XmlPullParser pullParser) { Syll syll; syll = new Syll(); syll.beg_pos = getInt(pullParser, "beg_pos"); syll.end_pos = getInt(pullParser, "end_pos"); syll.content = getContent(pullParser); syll.symbol = getSymbol(pullParser); syll.dp_message = getInt(pullParser, "dp_message"); syll.time_len = getInt(pullParser, "time_len"); return syll; } private Word createWord(XmlPullParser pullParser) { Word word; word = new Word(); word.beg_pos = getInt(pullParser, "beg_pos"); word.end_pos = getInt(pullParser, "end_pos"); word.content = getContent(pullParser); word.symbol = getSymbol(pullParser); word.time_len = getInt(pullParser, "time_len"); word.dp_message = getInt(pullParser, "dp_message"); word.total_score = getFloat(pullParser, "total_score"); word.global_index = getInt(pullParser, "global_index"); word.index = getInt(pullParser, "index"); return word; } private Sentence createSentence(XmlPullParser pullParser) { Sentence sentence; sentence = new Sentence(); sentence.beg_pos = getInt(pullParser, "beg_pos"); sentence.end_pos = getInt(pullParser, "end_pos"); sentence.content = getContent(pullParser); sentence.time_len = getInt(pullParser, "time_len"); sentence.index = getInt(pullParser, "index"); sentence.word_count = getInt(pullParser, "word_count"); return sentence; } private String getLanguage(XmlPullParser pullParser) { return pullParser.getAttributeValue(null, "lan"); } private String getExceptInfo(XmlPullParser pullParser) { return pullParser.getAttributeValue(null, "except_info"); } private boolean getIsRejected(XmlPullParser pullParser) { String isRejected = pullParser.getAttributeValue(null, "is_rejected"); if (null == isRejected) { return false; } return Boolean.parseBoolean(isRejected); } private String getSymbol(XmlPullParser pullParser) { return pullParser.getAttributeValue(null, "symbol"); } private float getFloat(XmlPullParser pullParser, String attrName) { String val = pullParser.getAttributeValue(null, attrName); if (null == val) { return 0f; } return Float.parseFloat(val); } private String getContent(XmlPullParser pullParser) { return pullParser.getAttributeValue(null, "content"); } private int getInt(XmlPullParser pullParser, String attrName) { String val = pullParser.getAttributeValue(null, attrName); if (null == val) { return 0; } return Integer.parseInt(val); } }