Android 中的 Xml解析

Xml解析

1.XML:Extensible Markup Language,即可扩展标记语言. 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.

XML和Json都可以在网络传输中使用的。现在主要是使用Json传输.

两者比较:
A,可读性来说,XML有明显的优势,毕竟人类的语言更贴近这样的说明结构。JSON读起来更像一个数据块,但读起来就比较费解了。
B,传输效率上来说,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。
从总体来看,XML比较适合于标记文档(配置工程),而JSON却更适于进行数据交换的处理。
C,编码难度XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
二.Xml解析:
1.PULL
Pull 内置于 Android 系统中。也是官方解析布局文件所使用的方式。Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。
而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。

2.SAX
SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。缺点是不能倒退。
通过事件解析
方法类似于SAX 当元素开始时调用
用法 四个常量 START-DOCUMENT开始文档 END-DOCUMENT结束文档 START-TAG开始标签 END-TAG结束标签
循环条件 不等于结束文档 setInput(设置解析源)

3.DOM
DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点是加载大文档时效率低下。
自定义类继承DefaultHandler 重写5个方法 4个方法为事件方法 一个方法为转换方法
特点:流式解析 读到哪里解析到哪里


<bookstore>
    <book id="1">
        <name>冰与火之歌name>
        <author>乔治马丁author>
        <year>2014year>
        <price>89price>
    book>
    <book id="2">
        <name>安徒生童话name>
        <author>安徒生author>
        <year>2004year>
        <price>77price>
    book>
bookstore>
//Bean类

package com.example.day11exam.xml;

public class BookBean {

    String id;
    String name;
    String author;
    String year;
    String price;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }



    @Override
    public String toString() {
        return "BookBean{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", year='" + year + '\'' +
                ", price='" + price + '\'' +
                '}';
    }
}

package com.example.day11exam.xml;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.example.day11exam.R;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class Main2Activity extends AppCompatActivity {

    /**
     * 解析为了获得 对象、集合
     * xml:标记语言,用来做网络传输
     *
     * @param savedInstanceState
     */
    ArrayList<BookBean> bookBeans;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);


//dom解析
        dom();



//        pool();
//        sax();
    }

    private void sax() {

    }

    private void pool() {
    }

    private void dom() {
        bookBeans=new ArrayList<>();
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//获得解析工厂
        try {
            DocumentBuilder b=factory.newDocumentBuilder();

            InputStream open = getAssets().open("book.xml");//获取xml文件

            Document document=b.parse(open);//把文件内容添加到内存中

            NodeList list=document.getElementsByTagName("book");//获取文件中所有节点为book的内容,并打算将这些内容存入到list中
            //由于有好多个book节点,所以我们要list做遍历
            for(int i=0;i<list.getLength();i++) {
                //这样就拿到了其中一个book节点的内容 也就是一个对象的内容, 包括5个属性
                Node item = list.item(i);//当I等于0的时候 获得的就是第一个book对象 在文件中一共有两个book对象
                String id = item.getAttributes().getNamedItem("id").getNodeValue();//拿到了id这个属性的值


                BookBean bookBean = new BookBean();//这就是那个对象

                bookBean.setId(id);
                NodeList childNodes = item.getChildNodes();//获取所有的子节点
                int length = childNodes.getLength();//获取所有子节点的数量
                for (int j = 0; j < length; j++) {
                    //获取出来所有的节点都是Note,可以一个个单独获取,也可以获取所有,然后遍历
                    Node node1 = childNodes.item(j);
                    if ("name".equals(node1.getNodeName())) {
                        bookBean.setName(node1.getTextContent());
                    } else if ("author".equals(node1.getNodeName())) {
                        bookBean.setAuthor(node1.getTextContent());
                    } else if ("year".equals(node1.getNodeName())) {
                        bookBean.setYear(node1.getTextContent());
                    } else if ("price".equals(node1.getNodeName())) {
                        bookBean.setPrice(node1.getTextContent());
                    }

                }
                bookBeans.add(bookBean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i=0;i<bookBeans.size();i++) {
            Log.d("###", "dom: "+bookBeans.get(i));
        }
    }
}

sax解析
 public void XmlSax(){
        try {
            SAXParserFactory saxParserFactory= SAXParserFactory.newInstance();

            SAXParser saxParser = saxParserFactory.newSAXParser();

            MyxmlSax myxmlSax=new MyxmlSax();

            InputStream open = getAssets().open("book.xml");
            saxParser.parse(open,myxmlSax);
            bookBeans=new ArrayList<>();
            bookBeans=myxmlSax.getBookBeans();
            RecAdapter recAdapter = new RecAdapter(bookBeans, MainActivity.this);
            recyclerView.setAdapter(recAdapter);


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

    class MyxmlSax extends DefaultHandler{
        ArrayList<BookBean> bookBeans;
        BookBean bookBean;
        String stemp;//用来村放解出来的字符串

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            bookBeans=new ArrayList<>();
        }

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

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);

            if(qName.equals("book")){
                bookBean=new BookBean();
                bookBean.setId(attributes.getValue("id"));
            }

        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);

            if("name".equals(qName)){
                bookBean.setName(stemp);
            }else if("author".equals(qName)){
                bookBean.setAuthor(stemp);
            }else if("year".equals(qName)){
                bookBean.setYear(stemp);
            }else if("price".equals(qName)){
                bookBean.setYear(stemp);
            }

            if(qName.equals("book")){
                bookBeans.add(bookBean);
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            stemp=new String(ch,start,length);
        }

        public ArrayList<BookBean> getBookBeans() {
            return bookBeans;
        }
    }

pull解析

    private void xmlpull() {
        bookBeans = new ArrayList<>();
        BookBean bookBean = null;
        try {
//获得解析工厂
            XmlPullParserFactory pullParserFactory = XmlPullParserFactory.newInstance();
            //解析器
            XmlPullParser parser = pullParserFactory.newPullParser();
            InputStream open = getAssets().open("book.xml");

            parser.setInput(open, "utf-8");//设置解析原
            //获得事件的类型
            int eventType = parser.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if (parser.getName().equals("book")) {
                            bookBean = new BookBean();
                            bookBean.id = parser.getAttributeValue(0);
                        } else if (parser.getName().equals("name")) {
                          bookBean.name=parser.nextText();
                        } else if (parser.getName().equals("author")) {
                            bookBean.author=parser.nextText();
                        } else if (parser.getName().equals("year")) {
                            bookBean.year=parser.nextText();
                        } else if (parser.getName().equals("price")) {
                            bookBean.price=parser.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if (parser.getName().equals("book")) {
                            bookBeans.add(bookBean);
                        }
                        break;
                }
              eventType=  parser.next();
            }
            RecAdapter recAdapter = new RecAdapter(bookBeans, MainActivity.this);
            recyclerView.setAdapter(recAdapter);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

你可能感兴趣的:(Android中简单系统功能,Xml解析)