XML 文件的解析

网络上传输数据最常见的两种格式是 XML 和JSON
先来看一下XML文件 如何解析

要解析的文件

http://www.runoob.com/try/xml/simple.xml

Pull 解析方式

  //pull解析XML
    private void parseXMLWithPull(String xmlData) {
        try {

            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser  xmlPullParser = factory.newPullParser();

            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType = xmlPullParser.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT){
                String nodeName = xmlPullParser.getName();

                switch (eventType){
                    case XmlPullParser.START_DOCUMENT:
                        foodList = new ArrayList<>(); // 初始化foodList集合
                        break;
                    case XmlPullParser.START_TAG:{
                        if("food".equals(nodeName)){
                          food =   new Food();

                        }else if("name".equals(nodeName)){
                           food.setName(xmlPullParser.nextText());

                        }else if("price".equals(nodeName)){
                            food.setPrice(xmlPullParser.nextText());

                        }else if("description".equals(nodeName)){
                            food.setDescription(xmlPullParser.nextText());

                        }else if ("calories".equals(nodeName)){
                            food.setCalories(Integer.parseInt(xmlPullParser.nextText()));

                        }
                    }
                    break;

                    case XmlPullParser.END_TAG:{
                        if ("food".equals(nodeName)){
                            foodList.add(food);
                            Log.d("-------MainActivity","\t\tname;"+food.getName() +" \t\t price:"+food.getPrice()+
                                    "\t\tdescription:"+food.getDescription()+"\t\tcalories:"+food.getCalories());

                            food = null;
                        }
                    }
                    break;

                    default:
                        break;
                }
                    // 手动的触发下一个事件
                    eventType=xmlPullParser.next();

            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

SAX 解析

//SAX解析XML 需要先 继承   DefaultHandler  重写方法 
public class ContentHandler extends DefaultHandler {
    private String nodeName;
    private StringBuilder name;
    private StringBuilder price;
    private StringBuilder description;
    private StringBuilder calories;

    @Override
    public void startDocument() throws SAXException {
        name = new StringBuilder();
        price = new StringBuilder();
        description = new StringBuilder();
        calories = new StringBuilder();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //记录当前节点名
        nodeName = localName;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

//   根据当前节点名 判断将内容添加到那个StringBuilder中
        if("name".equals(nodeName)){
            name.append(ch,start,length);

        }else if("price".equals(nodeName)){
            price.append(ch,start,length);

        }else if("description".equals(nodeName)){
            description.append(ch,start,length);

        }else if ("calories".equals(nodeName)){
            calories.append(ch,start,length);

        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("food".equals(localName)){
            Log.d("-------MainActivity","\t\tname;"+name.toString().trim() +" \t\t price:"+price.toString().trim()+
                    "\t\tdescription:"+description.toString().trim()+"\t\tcalories:"+calories.toString().trim());

            //将StringBuilder清空
            name.setLength(0);
            price.setLength(0);
            description.setLength(0);
            calories.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}

    //sax解析XML
    private void parseXMLWithSAX(String xmlData) {

        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHandler handler = new ContentHandler();
            //将 ContentHandler 的实例设置到 xmlReader
            xmlReader.setContentHandler(handler);
            //开始执行解析
            xmlReader.parse(new InputSource(new StringReader(xmlData)));

        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

http请求 OkHttp 开源项目

https://github.com/EmotionalRonanyg/okhttp

OkHttp 依赖 compile ‘com.squareup.okhttp3:okhttp:3.7.0’

    private void sendRequestWithOkHttp() {
        //开启线程 发送网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //OkHttp 开源项目
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url("http://www.runoob.com/try/xml/simple.xml")
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();

                    //pull解析XML
                    parseXMLWithPull(responseData);
                    //sax解析XML
                    parseXMLWithSAX(responseData);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();//开启线程
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值