XML解析方法(Pull和Sax以及DOM)

1.Pull方式解析
借助XmlPullParser类

 private void parseXMLWithPull(String XMLString) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            //将XML传入xmlPullParser对象
            xmlPullParser.setInput(new StringReader(XMLString));
            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            while (eventType != xmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG: {
                        if ("id".equals(nodeName)) {
                            id = xmlPullParser.nextText();
                        } else if ("name".equals(nodeName)) {
                            name = xmlPullParser.nextText();
                        }
                        break;
                    }
                    case XmlPullParser.END_TAG: {
                        if ("app".equals(nodeName)) {
                            Log.d("MainActivity", "id is" + id);
                            Log.d("MainActivity", "name is" + name);
                        }
                        break;
                    }
                    default:
                        break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.Sax方式解析
新建ContentHandler继承DefaultHandler并重写其中的五个方法

public class ContentHandler extends DefaultHandler {

    private String nodeName;

    private StringBuffer id;

    private StringBuffer name;

    @Override
    public void startDocument() throws SAXException {
        id = new StringBuffer();
        name = new StringBuffer();
    }

    @Override
    public void endDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        nodeName = localName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("app".equals(localName)) {
            Log.d("MainActivity", "id is" + id.toString().trim());
            Log.d("MainActivity", "name is" + name.toString().trim());
            //清空 StringBuffer
            id.setLength(0);
            name.setLength(0);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if ("id".equals(nodeName)) {
            id.append(ch, start, length);
        } else if ("name".equals(nodeName)) {
            name.append(ch,start,length);
        }
    }
}

解析方法如下,传入的参数是读取的xml文件字符串

private void parseXMLWithSax(String XMLString) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHandler handler = new ContentHandler();
            xmlReader.setContentHandler(handler);
            xmlReader.parse(new InputSource(new StringReader(XMLString)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

其中以上两种方式的xml文件如下:

<apps>
  <app>
    <id>黑龙江</id>
      <name>哈尔滨</name>
      <name>哈尔滨2</name>
  </app>
  <app>
    <id>广东</id>
      <name>广州</name>
  </app>
  <app>
    <id>台湾</id>
       <name>台北</name>
  </app>
  <app>
    <id>新疆</id>
      <name>乌鲁木齐</name>
  </app>
</apps>

整体程序如下:

package com.jacky.networktest;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.SAXParserFactory;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button sendHttpRequest;
    private TextView response_text;
    private LinearLayout activity_main;
    private ProgressDialog dialog;

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                String temp = (String) msg.obj;
                parseXMLWithSax(temp);
//                parseXMLWithPull(temp);
//                response_text.setText(temp);
                dialog.dismiss();
            }
        }
    };

    /**
     * Sax 方式解析 XML 文件
     *
     * @param XMLString
     */
    private void parseXMLWithSax(String XMLString) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHandler handler = new ContentHandler();
            xmlReader.setContentHandler(handler);
            xmlReader.parse(new InputSource(new StringReader(XMLString)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Pull 方式解析 XML 文件
     *
     * @param XMLString
     */
    private void parseXMLWithPull(String XMLString) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            //将XML传入xmlPullParser对象
            xmlPullParser.setInput(new StringReader(XMLString));
            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            while (eventType != xmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG: {
                        if ("id".equals(nodeName)) {
                            id = xmlPullParser.nextText();
                        } else if ("name".equals(nodeName)) {
                            name = xmlPullParser.nextText();
                        }
                        break;
                    }
                    case XmlPullParser.END_TAG: {
                        if ("app".equals(nodeName)) {
                            Log.d("MainActivity", "id is" + id);
                            Log.d("MainActivity", "name is" + name);
                        }
                        break;
                    }
                    default:
                        break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();


    }

    private void initView() {
        sendHttpRequest = (Button) findViewById(R.id.sendHttpRequest);
        response_text = (TextView) findViewById(R.id.response_text);
        activity_main = (LinearLayout) findViewById(R.id.activity_main);

        sendHttpRequest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sendHttpRequest:
                dialog = new ProgressDialog(MainActivity.this);
                dialog.setMessage("Loading...");
                dialog.setCancelable(false);
                dialog.show();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        HttpURLConnection connection = null;
                        try {
                            URL url = new URL("http://10.0.2.2/China_province.xml");
                            connection = (HttpURLConnection) url.openConnection();
                            connection.setRequestMethod("GET");
                            InputStream is = connection.getInputStream();
                            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                            String len = null;
                            StringBuffer buffer = new StringBuffer();
                            while ((len = reader.readLine()) != null) {
                                buffer.append(len);
                            }
                            Message message = new Message();
                            message.what = 0;
                            message.obj = buffer.toString();
                            handler.sendMessage(message);

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

                    }
                }).start();
                break;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯刘

我 风暴降生 打钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值