选择一个解析器
推荐使用XmlPullParser,这是一个在android里效率高而且可维护的方法。历史上android有两个实现这个接口。
· KXmlParser通过XmlPullParserFactory.newPullParser()。
· ExpatPullParser通过Xml.newPullParser()。
两个都可以,下面的例子是使用了第二个方法。
分析XML
以有道翻译接口为例:
<?xml version="1.0" encoding="UTF-8"?>
<youdao-fanyi>
<errorCode>0</errorCode>
<query><![CDATA[red]]></query>
<!-- 有道翻译 -->
<translation>
<paragraph><![CDATA[红色的]]></paragraph>
</translation>
<!-- 有道词典-基本词典 -->
<basic>
<!-- 音标 -->
<phonetic><![CDATA[red]]></phonetic>
<!-- 美式音标 -->
<us-phonetic><![CDATA[rɛd]]></us-phonetic>
<!-- 英式音标 -->
<uk-phonetic><![CDATA[red]]></uk-phonetic>
<!-- 基本释义 -->
<explains>
<ex><![CDATA[n. 红色,红颜料;赤字]]></ex>
<ex><![CDATA[adj. 红色的;红肿的,充血的]]></ex>
<ex><![CDATA[n. (Red)人名;(英、德)雷德]]></ex>
</explains>
</basic>
<!-- 有道词典-网络释义 -->
<web>
<explain>
<key><![CDATA[Red]]></key>
<value>
<ex><![CDATA[红色]]></ex>
<ex><![CDATA[超危险特工]]></ex>
<ex><![CDATA[红色]]></ex>
</value>
</explain>
<explain>
<key><![CDATA[Red Wine]]></key>
<value>
<ex><![CDATA[红葡萄酒]]></ex>
<ex><![CDATA[红酒]]></ex>
<ex><![CDATA[红葡萄酒]]></ex>
</value>
</explain>
<explain>
<key><![CDATA[red card]]></key>
<value>
<ex><![CDATA[红牌]]></ex>
<ex><![CDATA[红牌]]></ex>
<ex><![CDATA[争议红牌]]></ex>
</value>
</explain>
</web>
</youdao-fanyi>
通过分析我们建立一个YoudaoFanyi类
public static class YoudaoFanyi{
private String errorCode;
private String query;
private String translationParagraph;
private String basicPhonetic;
private String basicUSPhonetic;
private String basicUkPhonetic;
private List<String> explains;
private Map<String,List<String>> webExplain;
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public void setQuery(String query) {
this.query = query;
}
public void setTranslationParagraph(String translationParagraph) {
this.translationParagraph = translationParagraph;
}
public void setBasicPhonetic(String basicPhonetic) {
this.basicPhonetic = basicPhonetic;
}
public void setBasicUSPhonetic(String basicUSPhonetic) {
this.basicUSPhonetic = basicUSPhonetic;
}
public void setBasicUkPhonetic(String basicUkPhonetic) {
this.basicUkPhonetic = basicUkPhonetic;
}
public void setExplains(List<String> explains) {
this.explains = explains;
}
public void setWebExplain(Map<String,List<String>> webExplain) {
this.webExplain = webExplain;
}
public String getErrorCode() {
return errorCode;
}
public String getBasicUkPhonetic() {
return basicUkPhonetic;
}
public String getQuery() {
return query;
}
public String getTranslationParagraph() {
return translationParagraph;
}
public String getBasicUSPhonetic() {
return basicUSPhonetic;
}
public List<String> getExplains() {
return explains;
}
public Map<String,List<String>> getWebExplain() {
return webExplain;
}
public String getBasicPhonetic() {
return basicPhonetic;
}
//方便调试
@Override
public String toString() {
return getErrorCode()+"\n"+
getQuery()+"\n"+
getTranslationParagraph()+"\n"+
getBasicPhonetic()+"\n"+
getBasicUSPhonetic()+"\n"+
getBasicUkPhonetic()+"\n"+
getExplains()+"\n"+
getWebExplain();
}
}
实例化解析器
public class StackOverflowXmlParser {
//我们不适用namespaces
private static final String ns = null;
public YoudaoFanyi parse(InputStream in) throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,false);
parser.setInput(in,null);
parser.nextTag();
return readYoudaoFanyi(parser);
}finally {
in.close();
}
}
...
}
解析XML
public class StackOverflowXmlParser {
...
private YoudaoFanyi readYoudaoFanyi(XmlPullParser parser) throws IOException, XmlPullParserException {
YoudaoFanyi fanyi = new YoudaoFanyi();
parser.require(XmlPullParser.START_TAG,ns,"youdao-fanyi");
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
//开始查找条目标签
if(name.equals("errorCode")){
fanyi.setErrorCode(parser.nextText());
} else if(name.equals("query")){
fanyi.setQuery(parser.nextText());
} else if(name.equals("translation")){
readTranslation(parser,fanyi);
} else if (name.equals("basic")){
readBasic(parser,fanyi);
} else if(name.equals("web")){
readWeb(parser,fanyi);
} else {
//跳过不用的标签
skip(parser);
}
}
return fanyi;
}
private void readBasic(XmlPullParser parser, YoudaoFanyi fanyi) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG,ns,"basic");
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("phonetic")){
fanyi.setBasicPhonetic(parser.nextText());
} else if(name.equals("us-phonetic")){
fanyi.setBasicUSPhonetic(parser.nextText());
} else if(name.equals("uk-phonetic")){
fanyi.setBasicUkPhonetic(parser.nextText());
} else if(name.equals("explains")){
readExplains(parser,fanyi);
}
}
}
private void readTranslation(XmlPullParser parser, YoudaoFanyi fanyi) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG,ns,"translation");
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("paragraph")){
fanyi.setTranslationParagraph(parser.nextText());
}
}
}
private void readWeb(XmlPullParser parser, YoudaoFanyi fanyi) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG,ns,"web");
Map<String,List<String>> mapWeb = new HashMap<>();
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("explain")){
readWebExplain(parser,mapWeb);
}
}
fanyi.setWebExplain(mapWeb);
}
private void readWebExplain(XmlPullParser parser, Map<String, List<String>> mapWeb) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG,ns,"explain");
String key = null;
List<String> list = null;
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("key")){
key = parser.nextText();
} else if(name.equals("value")){
list = readWebExplainValue(parser);
}
}
mapWeb.put(key,list);
}
private List<String> readWebExplainValue(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG,ns,"value");
List<String> list = new ArrayList<>();
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("ex")) {
list.add(parser.nextText());
}
}
return list;
}
private void readExplains(XmlPullParser parser, YoudaoFanyi fanyi) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG,ns,"explains");
List<String> ex = new ArrayList<>();
while (parser.next()!=XmlPullParser.END_TAG){
if(parser.getEventType()!=XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("ex")){
ex.add(parser.nextText());
}
}
fanyi.setExplains(ex);
}
private void skip(XmlPullParser parser) throws IOException, XmlPullParserException {
if (parser.getEventType()!=XmlPullParser.START_TAG){
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0){
switch (parser.next()){
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
}
如何调用有道翻译接口,请查看网站有道翻译API.