Android解析XML的三种方式

在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式.

如图:

Android解析XML的三种方式_第1张图片

本篇博客使用的xml文件如下:(这里是获取网络XML)person.xml



  
	zhangsan
	21
  
  
	lisi
	22
  
  
	wangwu
	222
  

下面分别介绍三种解析方式。

第一种:DOM解析

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,
就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。
Node对象提供了相应的方法去获得它的父结点或子结点。
编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.
缺点: 一次性的完全加载整个xml文件,需要消耗大量的内存。

首先先获取网络XML数据:
 class MyTask extends AsyncTask{
        @Override
        protected Object doInBackground(Object[] params) {
            //获取网络XML数据 //解析XML//展示
            //原生态底层:URLConnction
            try {
                URL url=new URL("http://192.168.1.110:8080/person.xml");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //结果码(状态)//成功200   失败 未修改304
                //获取结果码
                int code=connection.getResponseCode();
                if(code==200){
                    //获取服务器返回来额结果
                    InputStream is=connection.getInputStream();
                    //打印(读)
                    BufferedReader br=new BufferedReader(new InputStreamReader(is));
                    String str=null;
                    while ((str=br.readLine())!=null){
                        Log.i("test",str);
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
           return null;
        }

获取数据成功,打印信息如下:
02-16 12:43:14.602 18236-18298/com.pxd.parsexml I/test: 
02-16 12:43:14.602 18236-18298/com.pxd.parsexml I/test: 
02-16 12:43:14.603 18236-18298/com.pxd.parsexml I/test:   
02-16 12:43:14.604 18236-18298/com.pxd.parsexml I/test: 	zhangsan
02-16 12:43:14.605 18236-18298/com.pxd.parsexml I/test: 	21
02-16 12:43:14.606 18236-18298/com.pxd.parsexml I/test:   
02-16 12:43:14.607 18236-18298/com.pxd.parsexml I/test:   
02-16 12:43:14.608 18236-18298/com.pxd.parsexml I/test: 	lisi
02-16 12:43:14.609 18236-18298/com.pxd.parsexml I/test: 	22
02-16 12:43:14.610 18236-18298/com.pxd.parsexml I/test:   
02-16 12:43:14.611 18236-18298/com.pxd.parsexml I/test:   
02-16 12:43:14.612 18236-18298/com.pxd.parsexml I/test: 	wangwu
02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test: 	222
02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test:   
02-16 12:43:14.615 18236-18298/com.pxd.parsexml I/test: 

Dom解析代码如下:

  class MyTask extends AsyncTask{
        @Override
        protected Object doInBackground(Object[] params) {
            //获取网络XML数据
            try {
                URL url=new URL("http://192.168.1.110:8080/person.xml");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //结果码(状态)//成功200   失败 未修改304
                //获取结果码
                int code=connection.getResponseCode();
                if(code==200){
                    //获取服务器返回来额结果
                    InputStream is=connection.getInputStream();
                    //解析XMLDOM解析=====================================
                    DocumentBuilderFactory documentBuilderFactory=  DocumentBuilderFactory.newInstance();
                    DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
                    Document document= documentBuilder.parse(is);
                    //获取根标签
                    Element element=document.getDocumentElement();
                    Log.i("test","根标签:"+element.getNodeName());
                   NodeList nodeList=element.getElementsByTagName("person");
                    for (int i = 0; i < nodeList.getLength(); i++) {
                        //获取单个
                      Element personElement= (Element) nodeList.item(i);
                        //获取属性id的值
                       String id= personElement.getAttribute("id");
                        Log.i("test",id);
                        //获取下面的子标签的值
                        Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);
                        String name= nameElement.getTextContent();
                        Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);
                        String age=ageElement.getTextContent();
                        Log.i("test",name+"  "+age);
                    }
              }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }catch (SAXException e) {
                e.printStackTrace();
            }catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
            return null;
        }

这里没有写展示页面,直接打印信息:

Android解析XML的三种方式_第2张图片


第二种SAX解析:

SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

Sax解析代码如下

  class MyTask extends AsyncTask{
        @Override
        protected Object doInBackground(Object[] params) {
            //获取网络XML数据
            try {
                URL url=new URL("http://192.168.1.110:8080/person.xml");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //结果码(状态)//成功200   失败 未修改304
                //获取结果码
                int code=connection.getResponseCode();
                if(code==200){
                    //获取服务器返回来额结果
                    InputStream is=connection.getInputStream();
                    //解析XMLSax解析=====================================
                    //(边读边解析)
                  SAXParserFactory saxParseFactory=SAXParserFactory.newInstance();
                  SAXParser saxParse= saxParseFactory.newSAXParser();
                  saxParse.parse(is,new DefaultHandler(){
                      @Override
                      public void startDocument() throws SAXException {
                          super.startDocument();
                          Log.i("test","开始文档");
                      }
                      @Override
                      public void endDocument() throws SAXException {
                          super.endDocument();
                          Log.i("test","结束文档");
                      }
                      @Override
                      public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                          super.startElement(uri, localName, qName, attributes);
                          cuurentTag=localName;
                          //获取开始标签的名字
                          if("person".equals(localName)){
                              //取属性的值
                              String id=attributes.getValue(0);
                              Log.i("test",id);
                          }
                      }
                      @Override
                      public void endElement(String uri, String localName, String qName) throws SAXException {
                          super.endElement(uri, localName, qName);
                          cuurentTag=null;
                      }
                      @Override
                      public void characters(char[] ch, int start, int length) throws SAXException {
                          super.characters(ch, start, length);
                          if("name".equals(cuurentTag)){
                                //获取的值
                                String name=new String(ch,start,length);
                                Log.i("test", "   "+name);
                           }else if("age".equals(cuurentTag)){
                                //获取的值
                                String age=new String(ch,start,length);
                                Log.i("test", "   "+age);
                            }
                      }
                  });
              }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }
            return null;
        }


效果图:

Android解析XML的三种方式_第3张图片


第三种PULL解析(类似SAX)

代码如下:

 //异步任务类AsyncTask
    class MyTask extends AsyncTask{
        @Override
        protected Object doInBackground(Object[] params) {
            //获取网络XML数据
            try {
                URL url=new URL("http://192.168.1.110:8080/person.xml");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //结果码(状态)//成功200   失败 未修改304
                //获取结果码
                int code=connection.getResponseCode();
                if(code==200){
                    //获取服务器返回来额结果
                    InputStream is=connection.getInputStream();
                    //使用PULL解析
                    XmlPullParser xmlPullParser= Xml.newPullParser();
                    xmlPullParser.setInput(is,"UTF-8");
                    //获取解析的标签的类型
                    int type=xmlPullParser.getEventType();
                    while(type!=XmlPullParser.END_DOCUMENT){
                        switch (type) {
                            case XmlPullParser.START_TAG:
                                //获取开始标签的名字
                                String starttgname = xmlPullParser.getName();
                                if ("person".equals(starttgname)) {
                                    //获取id的值
                                    String id = xmlPullParser.getAttributeValue(0);
                                    Log.i("test", id);
                                } else if ("name".equals(starttgname)) {
                                    String name = xmlPullParser.nextText();
                                    Log.i("test", name);
                                } else if ("age".equals(starttgname)) {
                                    String age = xmlPullParser.nextText();
                                    Log.i("test", age);
                                }
                                break;
                            case XmlPullParser.END_TAG:
                                break;
                        }//细节:
                        type=xmlPullParser.next();
                    }
              }
              } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            return null;
        }

打印信息如下:

Android解析XML的三种方式_第4张图片


你可能感兴趣的:(Android)