使用pull解析用xml方式存储的数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhihan7410/article/details/53385075

xml数据格式通常有3种解析方式:dom,sax,pull,现在一般用pull方式,pull是安卓内置的解析器.

使用pull解析用xml的话,xml文件是一层层节点往里剖析的,例如下面的xml,从进入xinxi节点开始,一直往里剖析节点,并根据用户自己的条件判断得到相应的数据
这里写图片描述
(这里的lianxiren在下面的代码中是被dianhuaben替换了)

流程:
1.调用java输入流读取xml文件
2.用ArrayList存放解析后的所有数据
3.定义一个相应的数据类,用来存放解析后的相应数据
4.定义节点名
5.通过XmlPullParserFactory获得XmlpullParser格式的数据
6.调用setInput方法为读到的数据设置编码格式
7.调用getEventType方法获得操作事件,并对数据进行解析

代码:
在UI下创建两个EditText做显示得到的数据,再创建一个Button按钮来触发读取数据

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pull_xml);
        //得到UI界面的两个EditText控件
        nameEditText  = (EditText) findViewById(R.id.pullNameET);
        phoneEditText = (EditText) findViewById(R.id.pullPhoneET);
    }
    //按键事件
public void pullXmlOnClick(View v) throws IOException, XmlPullParserException {
        //调用java输入流读取xml文件,这里是读取存储在SD卡里的Xml文件,具体的操作可以参考上一篇博客
        FileInputStream in = new FileInputStream(android.os.Environment.getExternalStorageDirectory()+"/dianhuaben.xml");
        //用ArrayList存放解析后的所有数据,这里PullXml是自己定义的一个类,用于剖析Xml文件数据
        PullXml pullXml = new PullXml();
        //调用PullXml的方法getpull(in),返回一个ArrayList对象
        ArrayList<Lianxiren> list = pullXml.getpull(in);
        //从得到的list中得到保存的数据,并显示出来
        nameEditText.setText(list.get(0).getName());
        phoneEditText.setText(list.get(0).getPhone());
    }

Lianxiren类:

//自定义的Lianxiren类
    public class Lianxiren {
    String name;
    String phone;
    //里面两个参数,并且有获取和设置这两个参数的方法
    public String getName() {
        return name;
    }
    public String getPhone() {
        return phone;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}

具体的剖析过程:
代码:

public class PullXml {
    //定义的剖析方法,参数为得到的文件流,这里的Lianxiren是自定义的一个数据类
    public ArrayList<Lianxiren> getpull(InputStream in) throws XmlPullParserException, IOException {
        //创建一个类型为Lianxiren的ArrayList用于存放解析后的所有数据
        ArrayList<Lianxiren> list = new ArrayList<Lianxiren>();
        //定义Lianxiren对象来加载数据以及jiedian对象用于判断节点的所属
        Lianxiren ren  = null;
        String jiedian = null;
        //通过XmlPullParserFactory获得XmlpullParser格式的数据
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xpp = factory.newPullParser();
        //调用setInput方法为读到的数据设置编码格式
        xpp.setInput(in,"utf-8");
        //调用getEventType方法获得操作事件,并对数据进行解析
        int type = xpp.getEventType();
        //只要不是在文档最后就一直解析
        while (type!=XmlPullParser.END_DOCUMENT){
            if(type==XmlPullParser.START_TAG){      //如果解析到节点开头
                jiedian = xpp.getName();            //就获得节点名
                if(jiedian.equals("dianhuaben")){   //如果节点是dianhuaben
                    ren = new Lianxiren();          //创建相应的类
                }
            }
            else if(type==XmlPullParser.TEXT){      //如果解析到数据内容
                if(jiedian.equals("name")){         //如果是节点是name
                    ren.setName(xpp.getText());     //就把name节点数据存放到类里
                }
                else if(jiedian.equals("phone")){   //如果是节点phone
                    ren.setPhone(xpp.getText());    //就把phone节点数据存放到类里
                }
            }
            else if(type==XmlPullParser.END_TAG){   //如果解析到节点结尾 这个结尾是相应标签的结尾
                                                    //假如这里是解析<dianhuaben>的节点,那么这里的结尾就是</dianhuaben>
                jiedian=xpp.getName();              //就获得节点名
                if(jiedian.equals("dianhuaben")){   //如果是节点是dianhuaben,也就是首尾节点一样。
                    list.add(ren);                  //就把解析到类里的数据存放到ArrayList里   
                    ren = null;                     //并清空相应类里的数据
                }
            }
            type = xpp.next();                      //如果dianhuaben不是唯一的节点,那么就继续开始下一轮节点解析
        }
        return list;                                //最后返回得到的数据
    }
}

猜你喜欢

转载自blog.csdn.net/linzhihan7410/article/details/53385075
今日推荐