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

如图:

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

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

<?xml version="1.0" encoding="UTF-8"?>  zhangsan21    lisi22    wangwu222  

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

第一种: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: <?xml version="1.0" encoding="UTF-8"?>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: zhangsan02-16 12:43:14.605 18236-18298/com.pxd.parsexml I/test: 2102-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: lisi02-16 12:43:14.609 18236-18298/com.pxd.parsexml I/test: 2202-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: wangwu02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test: 22202-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张图片


更多相关文章

  1. Android并发编程线程间通信的三种基本方式
  2. Android获取CPU使用率的几种方式
  3. Android XML属性在文档中的位置
  4. android中activity的启动方式
  5. Android 数据存储方式
  6. Android 文件打开方式
  7. Android LinearLayout及TextView的布局方式
  8. Android之快捷方式一——通过应用程序创建快捷方式

随机推荐

  1. AndroidStudio中多个Module依赖同一个jar
  2. 【Android】获取控件的宽高和位置
  3. Android(安卓)国际化 语言相关 和 打包
  4. 2011计划
  5. Android之ListView
  6. Android(安卓)下拉刷新,上拉加载动画,这
  7. Android通过自定义View实现心形(贝塞尔曲
  8. Ubuntu Linux14 64位下在Android(安卓)st
  9. Ubuntu 下 使用 adb logcat 显示 Android
  10. 思考一下!!!!my android