android学习(二十) 执行网络操作(三) 解析XML

选择一个解析器

推荐使用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.

学自android developer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值