Android解析XML的三种方式

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

如图:


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

<?xml version="1.0" encoding="UTF-8"?>
<persons>
  <person id="1">
	<name>zhangsan</name>
	<age>21</age>
  </person>
  <person id="2">
	<name>lisi</name>
	<age>22</age>
  </person>
  <person id="3">
	<name>wangwu</name>
	<age>222</age>
  </person>
</persons>

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

第一种: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: <persons>
02-16 12:43:14.603 18236-18298/com.pxd.parsexml I/test:   <person id="1">
02-16 12:43:14.604 18236-18298/com.pxd.parsexml I/test: 	<name>zhangsan</name>
02-16 12:43:14.605 18236-18298/com.pxd.parsexml I/test: 	<age>21</age>
02-16 12:43:14.606 18236-18298/com.pxd.parsexml I/test:   </person>
02-16 12:43:14.607 18236-18298/com.pxd.parsexml I/test:   <person id="2">
02-16 12:43:14.608 18236-18298/com.pxd.parsexml I/test: 	<name>lisi</name>
02-16 12:43:14.609 18236-18298/com.pxd.parsexml I/test: 	<age>22</age>
02-16 12:43:14.610 18236-18298/com.pxd.parsexml I/test:   </person>
02-16 12:43:14.611 18236-18298/com.pxd.parsexml I/test:   <person id="3">
02-16 12:43:14.612 18236-18298/com.pxd.parsexml I/test: 	<name>wangwu</name>
02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test: 	<age>222</age>
02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test:   </person>
02-16 12:43:14.615 18236-18298/com.pxd.parsexml I/test: </persons>

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);
                        //获取<person>属性id的值
                       String id= personElement.getAttribute("id");
                        Log.i("test",id);
                        //获取<person>下面的子标签<name><age>的值
                        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)){
                                //获取<name>的值
                                String name=new String(ch,start,length);
                                Log.i("test", "   "+name);
                           }else if("age".equals(cuurentTag)){
                                //获取<name>的值
                                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;
        }

打印信息如下:



“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

d_shadow

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值