zoukankan      html  css  js  c++  java
  • Android之Pull解析XML

    一.Pull解析方法介绍

      除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。Pull解析器的运行方式与SAX解析器相似。它也是事件触发的。Pull解析方式让应用程序完全控制文档该怎么样被解析。比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分的处理。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。Pull解析是一个遍历文档的过程,每次调用next()、nextTag()、nextToken()和nextText()都会向前推进文档,并使parser停留在某些事件上面,但是不能倒退。然后把文档设置给Parser。它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。Pull解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用Pull解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。

      SAX与Pull的区别:SAX解析器的工作方式是自动将事件处理器进行处理,因此不能控制事件的处理主动结束;而Pull解析器的工作方式为允许应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。

      优点: 解析速度快,占用资源少。

      缺点: 数据不持久。

      使用场合: 对于XML文档较大但只需要文档的一部分。

    二、PULL解析步骤

             1. 构建一个XmlPullParser对象

    XmlPullParser parser = Xml.newPullParser();
    parser.setInput(inputStream, "UTF-8");//设置事件源编码

             2. 获取事件类型

    int eventType = parser.getEventType();

             3. 获取文本内容

    //判断是否到结束节点 
    while (eventType != XmlPullParser.END_DOCUMENT) {
                    switch (eventType) {
                        //文档开始事件,可以进行数据初始化处理
                        case XmlPullParser.START_DOCUMENT:
                            ...
                            break;
                //开始元素事件
                        case XmlPullParser.START_TAG:
                            ...
                            break;
                        //结束元素事件
                        case XmlPullParser.END_TAG:
                            ...
                            break;
                    }
                    eventType = parser.next();
                }

    调用parser.nextText()方法可以获取下一个Text类型元素的值。

    三、PULL解析XML代码

    1.创建一个XML文件itcase.xml,并将其放在res/raw文件夹下。
    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="23">
            <name>liming</name>
            <age>30</age>
        </person>
        <person id="20">
            <name>lixiangmei</name>
            <age>25</age>
        </person>
    </persons>

    如果没有raw文件夹,就在res文件夹下创建一个raw文件夹,并创建xml文件。

    2.修改视图
    <Button
            android:id="@+id/pull_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="@dimen/fab_margin"
            android:gravity="center_horizontal"
            android:text="@string/PULL" />
    <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
    3.添加AnalyzePull类
    package com.zhangmiao.analyzexmldemo;
    
    import android.util.Xml;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlSerializer;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by zhangmiao on 2016/12/14.
     */
    public class AnalyzePull {
    
        public static List<Person> readXML(InputStream inputStream) {
            XmlPullParser parser = Xml.newPullParser();
    
            try {
                parser.setInput(inputStream, "UTF-8");
                int eventType = parser.getEventType();
    
                Person currentPerson = null;
                List<Person> persons = null;
    
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    switch (eventType) {
                        case XmlPullParser.START_DOCUMENT:
                            persons = new ArrayList<>();
                            break;
                        case XmlPullParser.START_TAG:
                            String name = parser.getName();
                            if (name.equalsIgnoreCase("person")) {
                                currentPerson = new Person();
                                currentPerson.setId(
                                        new Integer(parser.getAttributeValue(null, "id"))
                                );
                            } else if (currentPerson != null) {
                                if (name.equalsIgnoreCase("name")) {
                                    currentPerson.setName(parser.nextText());
                                } else if (name.equalsIgnoreCase("age")) {
                                    currentPerson.setAge(new Short(parser.nextText()));
                                }
                            }
                            break;
                        case XmlPullParser.END_TAG:
                            if (parser.getName().equalsIgnoreCase("person")
                                    && currentPerson != null) {
                                persons.add(currentPerson);
                                currentPerson = null;
                            }
                            break;
                    }
                    eventType = parser.next();
                }
                inputStream.close();
                return persons;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    4.修改MainActivity类
    package com.zhangmiao.analyzexmldemo;
    
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Button;
    import android.widget.TextView;
    
    import org.xml.sax.InputSource;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.io.StringWriter;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private static final String TAG = "AnalyzeXMLDemo";
    
        private TextView mTextView;
    
        private InputStream inputStream;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            Log.v(TAG, "onCreate");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                }
            });
    
            Button pullButton = (Button)findViewById(R.id.pull_button);
            mTextView = (TextView) findViewById(R.id.text);
    
            pullButton.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            String result = "";
            inputStream = getResources().openRawResource(R.raw.itcase);
            switch (v.getId()) {
                case R.id.pull_button:
                    result += "--------- PULL ---------" + "
    ";
                    File xmlFile = new File("myitcast.xml");
                    if (inputStream == null) {
                        result = "inputStream is null";
                    } else {
                        List<Person> personList = AnalyzePull.readXML(inputStream);
                        if (personList != null) {
                            for (int i = 0; i < personList.size(); i++) {
                                String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
                                        + " , age = " + personList.get(i).getAge() + ".
    ";
                                result += message;
                            }
                        }
                    }
                    mTextView.setText(result);
                   break;
                default:
                    break;
            }
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    }

     参考文章:

    http://www.open-open.com/lib/view/open1392780226397.html

    http://www.cnblogs.com/weixing/archive/2013/08/07/3243366.html

    http://www.tuicool.com/articles/IvQvyq

  • 相关阅读:
    完全卸载 Oracle
    Windows 下 Oracle 10g 手工创建数据库
    zip & unzip 命令
    J2EE的13种核心技术规范
    Windows 8发行预览版序列号
    wget百度百科
    Application's Life Cycle
    当前网络存在的安全问题
    Ubuntu 11.10 更换 LightDM 开机登录画面
    tmp文件夹的默认权限
  • 原文地址:https://www.cnblogs.com/zhangmiao14/p/6184201.html
Copyright © 2011-2022 走看看