Android数据解析 :XML

Home / Android MrLee 2016-9-23 3094

什么是可扩展标记语言?

  • 可扩展标记语言是一种很像 超文本标记语言 的标记语言

  • 它的设计宗旨是 传输数据 ,而不是 显示数据

  • 它的标签没有被预定义。您需要自行定义标签

  • 它被设计为具有自我描述性

  • 它是W3C的推荐标准

Android中解析XML数据的三种方式 :

  • SAX解析
    (Simple API for XML)事件驱动,解析速度快,占用内存少

  • DOM解析
    文档对象模型(Document Object Model)将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件

  • PULL解析
    事件驱动, 在解析过程中, 我们需要自己获取产生的事件然后做相应的操作. Android系统内部在解析各种XML时是用PULL解析器

效果展示

Android数据解析 :XML

xml.gif

代码

准备工作

  • users.xml(要解析的xml文件)

目录结构

目录结构

Android数据解析 :XML

Paste_Image.png

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user >
        <name>保罗</name>
        <age>10</age>
        <sex>男</sex>
    </user>
    <user >
        <name>金宝</name>
        <age>30</age>
        <sex>男</sex>
    </user>
    <user >
        <name>缺心</name>
        <age>18</age>
        <sex>女</sex>
    </user>
</users>
  • User.java类

    ( 略 )

  • 定义一个接口IUserParser.java

package com.lyp.xml;
import java.io.InputStream;
import java.util.List;
/**
 * Created by ${思格斯} on 2016/9/22 0022.
 */
public interface IUserParser {
    //解析输入流 得到User对象集合
    List<User> parse(InputStream is) throws Exception;
}

界面布局文件

  • activty_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:andro
    android:orientation="vertical"
    android:layout_
    android:layout_
    android:padding="5dp">
    <Button
        android:
        android:text="SAXParser"
        android:textSize="25sp"
        android:textAllCaps="false"
        android:layout_
        android:layout_/>
    <Button
        android:
        android:text="DOMParser"
        android:textSize="25sp"
        android:textAllCaps="false"
        android:layout_
        android:layout_/>
    <Button
        android:
        android:text="PULLParser"
        android:textSize="25sp"
        android:textAllCaps="false"
        android:layout_
        android:layout_/>
    <TextView
        android:
        android:textSize="25sp"
        android:layout_
        android:layout_/>
</LinearLayout>

开始定义实现IUserParser接口的解析类

方式一. SAX解析

package com.lyp.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
 * Created by ${思格斯} on 2016/9/22 0022.
 */
public class UserSaxParser implements IUserParser {
    @Override
    public List<User> parse(InputStream is) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();  //取得SAXParserFactory实例
        SAXParser parser = factory.newSAXParser();                  //从factory获取SAXParser实例
        MyHandler handler = new MyHandler();                        //实例化自定义Handler
        parser.parse(is, handler);                                  //根据自定义Handler规则解析输入流
        return handler.getUsers();
    }

    //需要重写DefaultHandler的方法
    private class MyHandler extends DefaultHandler {
        private List<User> users;
        private User user;
        private StringBuilder builder;
        //返回解析后得到的User对象集合
        public List<User> getUsers() {
            return users;
        }
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            users = new ArrayList<User>();
            builder = new StringBuilder();
        }
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if (localName.equals("user")) {
                user = new User();
            }
            builder.setLength(0);   //将字符长度设置为0 以便重新开始读取元素内的字符节点
        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            builder.append(ch, start, length);  //将读取的字符数组追加到builder中
        }
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if (localName.equals("id")) {
                user.setId(Long.parseLong(builder.toString()));
            } else if (localName.equals("name")) {
                user.setName(builder.toString());
            } else if (localName.equals("age")) {
                user.setAge(Integer.parseInt(builder.toString()));
            } else if (localName.equals("sex")) {
                user.setSex(builder.toString());
            } else if (localName.equals("user")) {
                users.add(user);
            }
        }
    }
}

方式二. DOM解析

package com.lyp.xml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
/**
 * Created by ${思格斯} on 2016/9/22 0022.
 */
public class UserDomParser implements IUserParser {
    private List<User> mUsers;
    @Override
    public List<User> parse(InputStream is) throws Exception {
        mUsers = new ArrayList<User>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//取得DocumentBuilderFactory实例
        DocumentBuilder builder = factory.newDocumentBuilder();               //从factory获取DocumentBuilder实例
        Document doc = builder.parse(is);                                     //解析输入流,得到Document实例
        Element rootElement = doc.getDocumentElement();                       //获取根节点users
        NodeList items = rootElement.getElementsByTagName("user");            //获取子节点user的集合
        for (int i = 0; i < items.getLength(); i++) {
            User user = new User();
            Node item = items.item(i);                                        //获取各个user节点
            NodeList properties = item.getChildNodes();                       //获取user节点下的各个子节点的集合
            for (int j = 0; j < properties.getLength(); j++) {
                Node property = properties.item(j);                           //获取各个子节点
                String nodeName = property.getNodeName();                     //获取各个子节点的名字
                if (nodeName.equals("id")) {
                    user.setId(Long.parseLong(property.getFirstChild().getNodeValue()));
                } else if (nodeName.equals("name")) {
                    user.setName(property.getFirstChild().getNodeValue());
                } else if (nodeName.equals("age")) {
                    user.setAge(Integer.parseInt(property.getFirstChild().getNodeValue()));
                } else if (nodeName.equals("sex")) {
                    user.setSex(property.getFirstChild().getNodeValue());
                }
            }
            mUsers.add(user);
        }
        return mUsers;
    }
}

方式三. PULL解析

package com.lyp.xml;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by ${思格斯} on 2016/9/22 0022.
 */
public class UserPullParser implements IUserParser{
    @Override
    public List<User> parse(InputStream is) throws Exception {
        List<User> users = null;
        User user = null;
//      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//      XmlPullParser parser = factory.newPullParser();
        XmlPullParser parser = Xml.newPullParser(); //由android.util.Xml创建一个XmlPullParser实例
        parser.setInput(is, "UTF-8");               //设置输入流 并指明编码方式
        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    users = new ArrayList<User>();
                    break;
                case XmlPullParser.START_TAG:
                    if (parser.getName().equals("user")) {
                        user = new User();
                    } else if (parser.getName().equals("id")) {
                        eventType = parser.next();
                        if (user != null) {
                            user.setId(Long.parseLong(parser.getText()));
                        }
                    } else if (parser.getName().equals("name")) {
                        eventType = parser.next();
                        if (user != null) {
                            user.setName(parser.getText());
                        }
                    } else if (parser.getName().equals("age")) {
                        eventType = parser.next();
                        if (user != null) {
                            user.setAge(Integer.parseInt(parser.getText()));
                        }
                    } else if (parser.getName().equals("sex")) {
                        eventType = parser.next();
                        if (user != null) {
                            user.setSex(parser.getText());
                        }
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if (parser.getName().equals("user")) {
                        if (users != null) {
                            users.add(user);
                        }
                        user = null;
                    }
                    break;
            }
            eventType = parser.next();
        }
        return users;
    }
}

MainActivty.java

package com.lyp.xml;
import android.content.res.XmlResourceParser;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btnSax;
    private Button btnDom;
    private Button btnPull;
    private TextView tvShow;
    private List<User> userList;
    private StringBuilder mBuilder;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        mBuilder=new StringBuilder();
    }
    private void initView() {
        btnSax= (Button) findViewById(R.id.btn_sax);
        btnDom= (Button) findViewById(R.id.btn_dom);
        btnPull= (Button) findViewById(R.id.btn_pull);
        tvShow= (TextView) findViewById(R.id.tv_show);
        btnSax.setOnClickListener(this);
        btnDom.setOnClickListener(this);
        btnPull.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //case R.id.btn_sax:
            //case R.id.btn_dom:
            case R.id.btn_pull:
                try {
                    //获取assets目录下的xml文件输入流
                    InputStream inputStream = getAssets().open("users.xml");
                    //Sax解析
                    //UserSaxParser saxParser = new UserSaxParser();
                    //userList = saxParser.parse(inputStream);
                    //Dom解析
                    //UserDomParser domParser = new UserDomParser();
                    //userList = domParser.parse(inputStream);
                    //Pull解析
                    UserPullParser pullParser = new UserPullParser();
                    userList = pullParser.parse(inputStream);
                    //将user集合中的数据读取出来
                    for (int i=0;i<userList.size();i++){
                        User user=userList.get(i);
                        long id= user.getId();
                        String name=user.getName();
                        int age=user.getAge();
                        String sex=user.getSex();
                        mBuilder.append("id:"+id +" name:"+name +" age:"+age +" sex:"+sex +"/r/n");
                    }
                    //将数据显示到TextView
                    tvShow.setText(mBuilder);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

来自:http://www.jianshu.com/p/00340117ff25





本文链接:https://www.it72.com/10470.htm

推荐阅读
最新回复 (0)
返回