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

来源:互联网 发布:mac怎么玩dota2国服 编辑:程序博客网 时间:2024/06/16 00:06

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;                                //最后返回得到的数据    }}
1 0
原创粉丝点击