xml解析pull sax dom

1:sax

package com.xml.sax2;


import android.util.Log;

import com.xml.model.Students;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

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

/**
 * 解析 students.xml 解析完后,调用.getList()方法获取数据,区别于SAXParserHandler使用回调
 * <p>
 * <p>
 * <p>
 * 这是安卓中内置的用于SAX处理XML的类,但是大多情况下我们都需要继承该类重写部分方法,才能达到处理XML数据的功能。
 * <p>
 * startDocument方法
 * 这是第一个需要重写的方法,每处理一个XML文档都会响应一次。所以这个方法里可以写需要初始化的代码。
 * <p>
 * startElement方法
 * 这是处理每个节点所触发的第一个方法,通过这个方法你可以直接当前处理的节点的名称以及属性。
 * <p>
 * characters方法
 * 这是处理每个节点所触发的第二个方法,通过这个方法你可以直接当前处理的节点中的属性。
 * <p>
 * endElement方法
 * 这是处理每个节点所触发的第三个方法,遇到一个节点的结束标签时,将会出发这个方法,并且会传递结束标签的名称
 * <p>
 * endDocument方法
 * 如果当前的XML文档处理完毕后,将会触发该方法,在此方法内你可以将最终的结果保存并且销毁不需要使用的变量。
 */

public class SAX2StudentsParserHandler extends DefaultHandler {
    private final String TAG = "SAX2";
    private List<Students> list;//解析数据存储
    Students students;
    Boolean currTag = false;//由于在<item></item>标签中有字符,需要做标记
    String currTagVal = "";

    public List<Students> getList() {
        return list;
    }

    /**
     * (1)文档开始
     *
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        list = new ArrayList<Students>();
        Log.d(TAG, "startDocument: ");
    }

    /**
     * (2)标签开始
     * students.xml为例:
     * 标签顺序是
     * <p>
     * <student group="z1" id="001">
     * <name>张三</name>
     * <sex></sex>
     * <age>18</age>
     * <email>zhangsan@163.com</email>
     * <birthday>1987-06-08</birthday>
     * <memo>好学生</memo>
     * </student>
     *
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        Log.d(TAG, "startElement: localName="+localName+"--qName="+qName);
        //遍历students标签
        currTag = true;

        if (localName.equals("student")) {
            students = new Students();
            //遍历解析student标签
            for (int i = 0; i < attributes.getLength(); i++) {
                //item标签保存参数 id url (name的处理在charaters方法中)
                if (attributes.getLocalName(i).equals("id")) {
                    students.setId(attributes.getValue(i));
                } else if (attributes.getLocalName(i).equals("group")) {
                    students.setGroup(attributes.getValue(i));
                }
            }
        }

    }



    /**
     * (3)接口字符
     *
     * @param ch
     * @param start
     * @param length
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);

        //student标签保存下获取子标签
        if (currTag) {
            currTagVal = new String(ch, start, length);
            Log.d(TAG, "characters: currTagVal=" + currTagVal);
            currTag = false;
        }
    }

    /**
     * (4)标签结束
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        Log.d(TAG, "endElement: localName=" + localName + "- qName=" + qName);
        currTag = false;
        //标签结束后,保存子标签下值,并将信息保存到list中
        if (localName.equals("student")) {
            list.add(students);
        }
        /**
         * startElement解析到该标签后,就会调用 characters方法获取数值,在endElement方法中保存数值
         */
        if (localName.equalsIgnoreCase("name")) {
            students.setName(currTagVal);
        } else if (localName.equalsIgnoreCase("sex")) {
            students.setSex(currTagVal);
        } else if (localName.equalsIgnoreCase("age")) {
            students.setAge(currTagVal);
        } else if (localName.equalsIgnoreCase("email")) {
            students.setEmail(currTagVal);
        } else if (localName.equalsIgnoreCase("birthday")) {
            students.setBirthday(currTagVal);
        } else if (localName.equalsIgnoreCase("memo")) {
            students.setMemo(currTagVal);
        }
    }

    /**
     * (5)文档结束
     *
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        Log.d(TAG, "endDocument: ");

    }
}
2:pull

 *
 */
private void xmlPullParser2() {
    InputStream inputStream2 = null;
    try {
        //创建factory
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

        //创建 XmlPullParser对象
        // 方式一:使用工厂类XmlPullParserFactory
        // 方式二:使用Android提供的实用工具类android.util.Xml
        XmlPullParser pullParser2 = factory.newPullParser();//factory 可以用 Xml 类代替

        //获取文件
        AssetManager assetManager = getAssets();
        inputStream2 = assetManager.open("channels.xml");

        //解析格式
        pullParser2.setInput(inputStream2, "UTF-8");

        /**
         * 解析详情:
         *
         * xml的数据可能只有几个是所需的,所以可以根据case筛选需要的参数值
         *
         */

        int eventType = pullParser2.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {//文档标签
            switch (eventType) {
                case XmlPullParser.START_DOCUMENT://文档标签
                    //可以做初始化list操作
                    channelList = new ArrayList<>();
                    break;
                // 触发开始元素事件
                case XmlPullParser.START_TAG:
                    String tagName = pullParser2.getName();//获取标签名称
                    Log.d(TAG, "START_TAG:" + tagName);
                    //获取item标签下的参数 id,group
                    if (tagName.equals("item")) {
                        channel = new Channel();
                        Log.d(TAG, "tagName:" + tagName + "--" + pullParser2.getAttributeValue(0) + "--" + pullParser2.getAttributeValue(1));
                        channel.setId(pullParser2.getAttributeValue(0));
                        channel.setUrl(pullParser2.getAttributeValue(1));//getAttributeName是获取key名称,getAttributeValue是获取value值
                        channel.setName(pullParser2.nextText());

                        channelList.add(channel);//保存到list中
                        channel = null;
                    }
                    break;

                case XmlPullParser.END_TAG://元素标签 结束,
                    break;
                default:
                    break;

            }
            eventType = pullParser2.next();///调用的是next的方法 来获取当前的状态
        }

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

        if (inputStream2 != null) {
            try {
                inputStream2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
3:doc

private void xmlDomParser() {
    InputStream inputStream = null;
    try {
        //创建factory
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //创建 DocumentBuilder对象
        DocumentBuilder builder = factory.newDocumentBuilder();//factory可以用Xml类代替

        //获取文件
        AssetManager assetManager = getAssets();
        inputStream = assetManager.open("students.xml");

        //创建Document对象,相当于代表xml表的对象
        Document document = builder.parse(inputStream);

        //获取根节点
        Element rootElement = document.getDocumentElement();

        //获取根节点所有student的节点
        NodeList parentNodeList = rootElement.getElementsByTagName("student");

        /**
         *  遍历所有的节点
         *
         */
        list = new ArrayList<>();
        //先遍历sutdent节点数据
        for (int i = 0; i < parentNodeList.getLength(); i++) {

            //student节点
            Element parentelement = (Element) parentNodeList.item(i);

            //获取student节点内的所有节点
            NodeList childNodeList = parentelement.getChildNodes();

            //获取<Students>标签内的参数
            String group = parentelement.getAttribute("group");
            String id = parentelement.getAttribute("id");

            students = new Students();
            students.setGroup(group);
            students.setId(id);

            //遍历student节点内的节点
            for (int j = 0; j < childNodeList.getLength(); j++) {
                //多标签加 Node.ELEMENT_NODE判断
                if (childNodeList.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    //依次赋值
                    if ("name".equals(childNodeList.item(j).getNodeName())) {//注意,这里不是:childNodeList.item(j).getFirstChild().getNodeName()

                        String name = childNodeList.item(j).getFirstChild().getNodeValue();
                        Log.d(TAG, "name =" + name);
                        students.setName(name);

                    } else if ("sex".equals(childNodeList.item(j).getNodeName())) {

                        String sex = childNodeList.item(j).getFirstChild().getNodeValue();
                        Log.d(TAG, "sex =" + sex);
                        students.setSex(sex);

                    } else if ("age".equals(childNodeList.item(j).getNodeName())) {

                        String age = childNodeList.item(j).getFirstChild().getNodeValue();
                        Log.d(TAG, "age =" + age);
                        students.setAge(age);

                    } else if ("email".equals(childNodeList.item(j).getNodeName())) {

                        String email = childNodeList.item(j).getFirstChild().getNodeValue();
                        Log.d(TAG, "email =" + email);
                        students.setEmail(email);

                    } else if ("birthday".equals(childNodeList.item(j).getNodeName())) {

                        String birthday = childNodeList.item(j).getFirstChild().getNodeValue();
                        Log.d(TAG, "birthday =" + birthday);
                        students.setEmail(birthday);

                    } else if ("memo".equals(childNodeList.item(j).getNodeName())) {

                        String memo = childNodeList.item(j).getFirstChild().getNodeValue();
                        Log.d(TAG, "memo =" + memo);
                        students.setMemo(memo);

                    }
                }
            }
            //添加到list中
            list.add(students);
        }

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

        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值