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

如图:


本篇博客使用的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;        }

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



第二种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;        }


效果图:



第三种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;        }

打印信息如下:



更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. Android(安卓)中如何获取editText文本信息
  3. git 获取android source
  4. Android(安卓)MaterialList源码解析
  5. 从Android到Swift iOS开发:语言与框架对比
  6. Android(安卓)studio 获取应用签名
  7. AsyncTask使用和源码解析
  8. android 获取文件夹、文件的大小 以B、KB、MB、GB 为单位
  9. [Android] 获取Android设备的唯一识别码|设备号|序号|UUID

随机推荐

  1. php RSA加密 JAVA 证书生成
  2. android与后台服务器的前后端通信
  3. java动态加载jar文件
  4. 003 恶补java运算(内容网摘)
  5. WebBrowser 遇到 javascript:void(0) 页
  6. IT兄弟连 JavaWeb教程 文件上传技术
  7. 读取Excel文件并跳过空行但不是空列
  8. Spring MVC-集成(Integration)-集成LOG4J示
  9. 有关JavaScript的认识
  10. Java将一个字符串中的多个连一起的空格变