个人博客系统

Android内置了Pull解析器,Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

private static final String XML_NAME = "test.xml";

//创建xml
public static void createXml(Context context) throws Exception{
    //获取输出流
    FileOutputStream fos = context.openFileOutput(XML_NAME, Context.MODE_PRIVATE);
    //通过Xml类的静态方法newSerializer获取到一个XmlSerializer
    XmlSerializer serializer = Xml.newSerializer();
    //设置xml输出流以及编码格式
    serializer.setOutput(fos, "UTF-8");
    //startDocument必须在setOutput之后使用
    serializer.startDocument("UTF-8", false);
    //创建persion根节点,第一个参数为命名空间,没有的话直接设置为null
    serializer.startTag(null, "persions");
    //循环创建测试数据
    for(int i=1; i<=5; i++) {
        serializer.startTag(null, "persion");
        //为persion节点添加id属性
        serializer.attribute(null, "id", i+"");
        //未persion节点添加名称子节点
        serializer.startTag(null, "name");
        serializer.text("name"+i);
        serializer.endTag(null, "name");
        serializer.endTag(null, "persion");
    }
    serializer.endTag(null, "persions");
    //结束,所有未关闭的Tag将会被关闭,所有数据将会被被flush
    serializer.endDocument();
    fos.close();
}

效果如下:

20161019205029.png

//解析XML
public static  void parserAndPrintXml(Context context) throws Exception {
    //通过Xml工具类获取到XmlPullParser
    XmlPullParser parser = Xml.newPullParser();
    //得到输入流
    FileInputStream fis = context.openFileInput(XML_NAME);
    //设置输入流,setInput方法会重置XmlPullParser,执行该方法后getEventType值会恢复到START_DOCUMENT
    parser.setInput(fis, "UTF-8");
    //获取事件类型,包括END_DOCUMENT, START_TAG, END_TAG, TEXT等
    int type = parser.getEventType();
    //创建集合保存解析到的数据
    List<Persion> persions = new ArrayList<Persion>();
    Persion persion = null;
    //END_DOCUMENT表示文件结束,只要不结束,就一直循环解析,
    //注意循环内必须type = parser.next(),否则会死循环
    while(type!=XmlPullParser.END_DOCUMENT){
        switch (type){
            //如果为START_TAG,根据需求获取到需要的内容
            case XmlPullParser.START_TAG:
                if("persion".equals(parser.getName())){
                    persion = new Persion();
                    //getAttributeValue获取id的属性值
                    persion.setId(parser.getAttributeValue(null, "id"));
                }else if("name".equals(parser.getName())){
                    //nextText()获取某个标签内的文本
                    persion.setName(parser.nextText());
                }
                break;
            case XmlPullParser.END_TAG:
                if("persion".equals(parser.getName())){
                    persions.add(persion);
                    persion = null;
                }
                break;
        }
        //移到下一个标签
        type = parser.next();
    }
    //输出数据
    for(Persion p : persions){
        Log.d("ZWH", p.toString());
    }
}
//Persion bean
static class Persion{
    String id;
    String name;

    public String getName() {
        return name;
    }

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

    public String getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return this.id+":"+this.name;
    }
}

输出结果如下:

20161019212030.png

网站公告
这里是挨踢农民工的博客,欢迎光临,以上为一段测试信息。
生命在于折腾
博客分类
文章归档 更多
网站统计
当前在线人数:9
注册会员数:108
网站总浏览量:161848
文章总数:17
留言总数:9
评论总数:21
分类总数:6
友情链接总数:1