简介

Pull解析XML XmlPullParser解析器的运行方式与SAX解析器相似。它提供了类似的事件(开始元素和结束元素),但需要使用parser.next()方法来提取它们。事件将作为数值代码被发送,因此可以根据不同的事件代码值来进行不同的处理。通过parser.getEventType()方法来取得事件的代码值。 当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取【属性】的值,也可调用它的nextText()获取本【节点】的值。
具体思路: 1、构建PullXmlParser解析器 XmlPullParser parser = Xml.newPullParser(); 
XmlPullParserFactory fac = XmlPullParserFactory.newInstance();//获取解析器工厂
XmlPullParser parser = fac.newPullParser();//通过解析器工厂获取解析器
2、将xml文档注册到解析器中 parser.setInput(is, "utf-8");

3、触发事件,获得事件类型码 int type = parser.getEventType();

4、针对事件进行具体分析 "name".equals(parser.getName());//判断开始标签元素是否是name parser.getAttributeValue(0);//得到标签的【属性值 】 parser.nextText();//获取下一个Text【节点的值 】
5、触发并进入下一个事件 type = parser.next();

Pull解析和Sax解析不一样的地方有:
  • pull读取xml文件后触发相应的事件调用方法返回的是数字
  • pull可以在程序中控制想解析到哪里就可以停止解析。
优点:不是一次加载,中途可以停止
Activity

public class MainActivity extends ListActivity {
    private TextView tv_info;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv_info = new TextView(this);// 将内容显示在TextView中
        tv_info.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
        getListView().addFooterView(tv_info);
        String[] array = { "生成xml文件(序列化)", "生成XML的内容", "解析XML文件", };
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 0:
            try {
                ArrayList<SmsInfo> infos = new ArrayList<SmsInfo>();
                Random random = new Random();
                for (int i = 0; i < 10; i++) {
                    infos.add(new SmsInfo(random.nextInt(100), "短信" + random.nextBoolean(), "电话:" + i));
                }
                SmsInfoXmlUtils.xmlSerializer(infos, Environment.getExternalStorageDirectory() + "/sms.xml");
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        case 1:
            try {
                BufferedReader bufr = new BufferedReader(new FileReader(new File(Environment.getExternalStorageDirectory() + "/sms.xml")));
                StringBuffer content = new StringBuffer();
                String line = null;
                //另外开辟一个缓冲区,存储读取的一行数据,返回包含该行内容的字符串,不包含换行符,如果已到达流末尾,则返回【 null】
                while ((line = bufr.readLine()) != null) {
                    content.append(line);
                }
                bufr.close();
                tv_info.setText(content.toString());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            break;
        case 2:
            try {
                ArrayList<SmsInfo> infos = SmsInfoXmlUtils.xmlParser(new FileInputStream(new File(Environment.getExternalStorageDirectory() + "/sms.xml")));
                StringBuffer sb = new StringBuffer();
                for (SmsInfo info : infos) {
                    sb.append(info + "\n");
                }
                tv_info.setText(sb.toString());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        }
    }
}

工具类

public class SmsInfoXmlUtils {
    /**将传入的数据以XML形式保存到制定的路径上*/
    public static void xmlSerializer(ArrayList<SmsInfo> infos, String path) throws IllegalArgumentException, IllegalStateException, IOException {
        XmlSerializer xmlSerializer = Xml.newSerializer();
        FileOutputStream fos = new FileOutputStream(new File(path));
        xmlSerializer.setOutput(fos, "utf-8");
        xmlSerializer.startDocument("utf-8", true);// 写入头,指定头部encoding、standalone属性的值
        xmlSerializer.startTag(null, "smss");// 写开始标签,定义namespace和标签名
        for (SmsInfo info : infos) {
            xmlSerializer.startTag(null, "sms");
            xmlSerializer.attribute(null, "id", info.id + "");// 写入【属性】名称及属性值
            xmlSerializer.startTag(null, "address");// 写入【节点】名称
            xmlSerializer.text(info.address);// 写入节点的值
            xmlSerializer.endTag(null, "address");
            xmlSerializer.startTag(null, "body");
            xmlSerializer.text(info.body);
            xmlSerializer.endTag(null, "body");
            xmlSerializer.endTag(null, "sms");
        }
        xmlSerializer.endTag(null, "smss");
        xmlSerializer.endDocument();
        fos.close();
    }
    /**参数为一个输入流,返回值为解析此输入流后生成的集合*/
    public static ArrayList<SmsInfo> xmlParser(InputStream is) throws Exception {
        ArrayList<SmsInfo> infos = null;
        SmsInfo info = null;
        
        XmlPullParserFactory fac = XmlPullParserFactory.newInstance();//获取解析器工厂
        XmlPullParser parser = fac.newPullParser();//通过解析器工厂获取解析器
        parser.setInput(is, "utf-8");//初始化,指定要解析的文件(输入流)及文件的编码方式
        int type = parser.getEventType();//获取当前事件的事件类型,类型值在XmlPullParser中均已定义
        while (type != XmlPullParser.END_DOCUMENT) {//一直解析文档,直到解析到文档的结束事件
            switch (type) {//根据事件的类型执行指定的事件
            case XmlPullParser.START_TAG://标签开始
                if ("smss".equals(parser.getName())) {//解析到全局开始标签
                    infos = new ArrayList<SmsInfo>();
                } else if ("sms".equals(parser.getName())) {//解析到sms标签
                    info = new SmsInfo();//创建一个自定义对象,保存信息
                    info.id = Integer.valueOf(parser.getAttributeValue(0));//得到标签的属性值,注意id是属性值,而下面的body是节点的值 
                } else if ("body".equals(parser.getName())) {//解析到body节点
                    info.body = parser.nextText();//nextText()为让解析器指向name节点,并得到name节点的值
                } else if ("address".equals(parser.getName())) {
                    info.address = parser.nextText();
                }
                break;
            case XmlPullParser.END_TAG://标签结束
                if ("sms".equals(parser.getName())) {//解析到sms闭合标签
                    infos.add(info);//将这个城市的天气信息存到集合中
                    info = null;//清空,节约内存
                }
                break;
            }
            type = parser.next();//这一步很重要,该方法返回一个事件码,也是触发下一个事件的方法 
        }
        return infos;//整个文档解析完毕,返回集合
    }
}

附件列表

XML 序列化与PULL解析的更多相关文章

  1. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  2. Android 下用 Pull 解析和生成 XML

    Java 中是可以用 SAX 和 DOM 解析 XML  的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull.Pull 使用简单,效率相对高,Android 下是集成了 Pul ...

  3. Android中XML解析-PULL解析

    前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...

  4. Android程序解析XML文件的方法及使用PULL解析XML案例

    一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...

  5. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  6. Android pull解析xml文件

    本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...

  7. 安卓使用pull解析器解析XML文件

    学习一下: public class MainActivity extends Activity { List<City> cityList; @Override protected vo ...

  8. pull解析xml文件

    pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...

  9. 用PULL解析器解析XML文件

    第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值): 1 package lee.service; 2 3 import java.io.InputS ...

随机推荐

  1. linux 下makefile

    linux下c编程中makefile是必须会的,我刚开始学,将我对makefile的理解记录下来. 通常我们在windows下编写c程序,有各种ide工具为我们执行makefile工作但在linux下 ...

  2. Vim的学习心得

    现在的工作是在unix平台,平时是用UE的ftp功能来写代码的,有时候文件大了,传输就很慢,而且经常不是很稳定.下定决心要学学Vim(现在应该没有人用原始的vi了吧),在经过二周的使用后,发现Vim实 ...

  3. SharePoint 获取Lookup 字段的值

    获取某个List里的Lookup字段的值是很普遍的事,那么我们将它封装起来 获取Lookup字段值的方法: /// <summary> /// To get lookup field Id ...

  4. PLSQL Developer如何设置自动打开上次编辑的文件

    作为开发人员经常把sql语句保存到文件中以方便下次继续使用,问题是plsqlDev重启后每次都需要手工打开这个文件,好不方便: 以下设置是plsqlDev启动后自动打开上次编辑的文件. 选择配置> ...

  5. Unity3D内存释放

    Unity3D内存释放 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resourc ...

  6. 辉哥用的这种方法实现ZABBIX的MYSQL批量监控

    不错的.集中和分布式,总是一对要解决的问题.应该可以再想更好的策略~~ 一.方案需求及思路 因跑MySQL服务的服务器比较多,并且每台服务器可能会运行多个不同端口的数据库,如果单独手动一台一台去修改a ...

  7. db2中修改表字段的长度,查看表字段长度,以及查看表字段已存放值大小

    修改表字段语句: alter table 表名 alter column  字段名 set data type varchar(7700) 如: ALTER TABLE JV_BI_BACK_OPER ...

  8. VS2012中使用Boost库的方法(超级简单)

    很不错的博客一定得看 http://my.csdn.net/caimouse 1.下载boost库 从http://www.boost.org上下载到目前最新的boost库,快速传送门:boost_1 ...

  9. 如何给Qlabel添加clicked属性(覆盖mousePressEvent,处理QMouseEvent消息,反正是软绘制,想怎么样就怎么样)

    clickedLabel.h #ifndef CLICKLABEL_H #define CLICKLABEL_H #include <QLabel> #include <QMouse ...

  10. 有趣的TWinControl.RecreateWnd,并分析在哪些场合使用

    CM_RECREATEWND = CM_BASE + 51; // TWinControl里有对应函数procedure CMRecreateWnd(var Message: TMessage); m ...