Android之Xml的三种解析方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/true100/article/details/85321430

Android中xml格式文件的三种解析小DEMO:

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Xml;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.ldm.kotlin.R;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;

import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

/**
 * 创建时间: 2018/12/28 0028
 * 创建人:ldm
 * 功能描述:
 */
public class XmlActivity extends Activity implements View.OnClickListener {
    private Button pull_btn;
    private Button dom_btn;
    private Button sax_btn;
    private TextView result_tv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xml_act_layout);
        pull_btn = (Button) findViewById(R.id.pull_btn);
        dom_btn = (Button) findViewById(R.id.dom_btn);
        sax_btn = (Button) findViewById(R.id.sax_btn);
        result_tv = (TextView) findViewById(R.id.result_tv);
        pull_btn.setOnClickListener(this);
        dom_btn.setOnClickListener(this);
        sax_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.pull_btn:
                try {
                    List<ItMan> pullMen = parseXmlByPull();
                    result_tv.setText(pullMen.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case R.id.dom_btn:
                try {
                    List<ItMan> domMen = parseXmlByDom();
                    result_tv.setText(domMen.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case R.id.sax_btn:
                try {
                    List<ItMan> saxMen = parseXmlBySax();
                    result_tv.setText(saxMen.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }
    }

    /**
     * 创建时间:   2018/12/28 0028 13:46
     * 作    者:   ldm
     * 描    述:   PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是:
     * 在PULL解析过程中,需要获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。
     * PULL解析器小巧轻便,解析快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析XML时也是用PULL解析器。
     * 参数说明:
     */
    private List<ItMan> parseXmlByPull() throws Exception {
        List<ItMan> list = null;
        ItMan itMan = null;
        //创建xmlPull解析器
        XmlPullParser parser = Xml.newPullParser();
        ///初始化xmlPull解析器
        parser.setInput(getAssets().open("worker.xml"), "utf-8");
        //读取文件的类型
        int type = parser.getEventType();
        //无限判断文件类型进行读取
        while (type != XmlPullParser.END_DOCUMENT) {
            switch (type) {
                //开始标签
                case XmlPullParser.START_TAG:
                    if ("worker".equals(parser.getName())) {
                        list = new ArrayList<>();
                    } else if ("itman".equals(parser.getName())) {
                        itMan = new ItMan();
                    } else if ("name".equals(parser.getName())) {
                        //获取name值
                        String name = parser.nextText();
                        itMan.setName(name);
                    } else if ("nickName".equals(parser.getName())) {
                        //获取nickName值
                        String nickName = parser.nextText();
                        itMan.setNickName(nickName);
                    } else if ("age".equals(parser.getName())) {
                        //获取age值
                        String age = parser.nextText();
                        itMan.setAge(Integer.parseInt(age));
                    } else if ("level".equals(parser.getName())) {
                        //获取level值
                        String level = parser.nextText();
                        itMan.setLevel(level);
                    }
                    break;
                //结束标签
                case XmlPullParser.END_TAG:
                    if ("itman".equals(parser.getName())) {
                        list.add(itMan);
                    }
                    break;
            }
            //继续读取标签类型
            type = parser.next();
        }
        return list;
    }

    /**
     * 创建时间:   2018/12/28 0028 13:49
     * 作    者:   ldm
     * 描    述:   DOM解析的原理是基于树形的结构和信息数据集合:
     * 将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示
     * 利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。
     * 参数说明:
     */
    private List<ItMan> parseXmlByDom() throws Exception {
        //一系列的初始化
        List<ItMan> itList = new ArrayList<>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        //获得Document对象
        Document document = builder.parse(getAssets().open("worker.xml"));
        //获得IT男的的List(本xml中就是根结点)
        NodeList manList = document.getElementsByTagName("itman");
        //遍历itman标签
        for (int i = 0; i < manList.getLength(); i++) {
            //获得itman标签
            Node node_student = manList.item(i);
            //获得itman标签里面的标签
            NodeList childNodes = node_student.getChildNodes();
            //新建对象
            ItMan iteMan = new ItMan();
            //遍历itman标签里面的标签
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node childNode = childNodes.item(j);
                //判断是name还是nickName
                if ("name".equals(childNode.getNodeName())) {
                    String name = childNode.getTextContent();
                    iteMan.setName(name);
                } else if ("nickName".equals(childNode.getNodeName())) {
                    String nickName = childNode.getTextContent();
                    iteMan.setNickName(nickName);
                } else if ("age".equals(childNode.getNodeName())) {
                    String age = childNode.getTextContent();
                    iteMan.setAge(Integer.parseInt(age));
                } else if ("level".equals(childNode.getNodeName())) {
                    String level = childNode.getTextContent();
                    iteMan.setLevel(level);
                }
            }
            //加到List中
            itList.add(iteMan);
        }
        return itList;
    }

    /**
     * 创建时间:   2018/12/28 0028 13:50
     * 作    者:   ldm
     * 描    述:   SAX解析核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的,也就是ContentHandler为重要核心。
     * 解析过程中每遇到一个事件源,只有调用事件解析器才能得到相应的处理;不过它的优点主要是解析速度快,占用内存少。
     * 非常适合在Android移动设备中使用
     * 参数说明:
     */
    private List<ItMan> parseXmlBySax() throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        //初始化Sax解析器
        SAXParser sp = spf.newSAXParser();
        //新建解析处理器
        SaxparseHandler handler = new SaxparseHandler();
        //将解析交给处理器
        sp.parse(getAssets().open("worker.xml"), handler);
        //返回List
        return handler.getList();
    }


    public class SaxparseHandler extends DefaultHandler {

        private List<ItMan> list;
        private ItMan itMan;
        //用于存储读取的临时变量
        private String tempString;

        /**
         * 解析到文档开始
         */
        @Override
        public void startDocument() throws SAXException {
            list = new ArrayList<>();
            super.startDocument();
        }

        /**
         * 解析到文档末尾调用
         */
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }

        /**
         * 每读到一个元素就调用
         */
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if ("itman".equals(qName)) {
                //读到student标签
                itMan = new ItMan();
            }
            super.startElement(uri, localName, qName, attributes);
        }

        /**
         * 读到元素的结尾时调用
         */
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if ("itman".equals(qName)) {
                list.add(itMan);
            }
            if ("name".equals(qName)) {
                itMan.setName(tempString);
            } else if ("nickName".equals(qName)) {
                itMan.setNickName(tempString);
            } else if ("age".equals(qName)) {
                itMan.setAge(Integer.parseInt(tempString));
            } else if ("level".equals(qName)) {
                itMan.setLevel(tempString);
            }
            super.endElement(uri, localName, qName);
        }

        /**
         * 读到属性内容调用
         */
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            tempString = new String(ch, start, length);
            super.characters(ch, start, length);
        }

        /**
         * 获取该List并返回
         */
        public List<ItMan> getList() {
            return list;
        }
    }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/pull_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:gravity="center"
        android:text="PULL解析"
        android:textSize="14sp" />

    <Button
        android:id="@+id/dom_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:gravity="center"
        android:text="DOM解析"
        android:textSize="14sp" />

    <Button
        android:id="@+id/sax_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:gravity="center"
        android:text="SAX解析"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/result_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp" />
</LinearLayout>

实体类:


/**
 * 创建时间: 2018/12/28 0028
 * 创建人:ldm
 * 功能描述:
 */
public class ItMan {
    private String name;
    private String nickName;
    private int age;
    private String level;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    @Override
    public String toString() {
        return "ItMan{" +
                "name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                ", age=" + age +
                ", level='" + level + '\'' +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/true100/article/details/85321430