android XML文件解析

来源:互联网 发布:java数组转换成字符串 编辑:程序博客网 时间:2024/06/14 22:41

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

第一种:DOM解析

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,
就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。Node对象提供了相应的方法去获得它的父结点或子结点。
编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.
缺点: 一次性的完全加载整个xml文件,需要消耗大量的内存。
  1. class MyTask extends AsyncTask{  
  2.       @Override  
  3.       protected Object doInBackground(Object[] params) {  
  4.           //获取网络XML数据  
  5.           try {  
  6.               URL url=new URL("http://192.168.1.110:8080/person.xml");  
  7.               HttpURLConnection connection= (HttpURLConnection) url.openConnection();  
  8.               //设置请求方式  
  9.               connection.setRequestMethod("GET");  
  10.               //设置连接超时的时间(优化)  
  11.               connection.setConnectTimeout(5000);  
  12.               //结果码(状态)//成功200   失败 未修改304  
  13.               //获取结果码  
  14.               int code=connection.getResponseCode();  
  15.               if(code==200){  
  16.                   //获取服务器返回来额结果  
  17.                   InputStream is=connection.getInputStream();  
  18.                   //解析XMLDOM解析=====================================  
  19.                   DocumentBuilderFactory documentBuilderFactory=  DocumentBuilderFactory.newInstance();  
  20.                   DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();  
  21.                   Document document= documentBuilder.parse(is);  
  22.                   //获取根标签  
  23.                   Element element=document.getDocumentElement();  
  24.                   Log.i("test","根标签:"+element.getNodeName());  
  25.                  NodeList nodeList=element.getElementsByTagName("person");  
  26.                   for (int i = 0; i < nodeList.getLength(); i++) {  
  27.                       //获取单个  
  28.                     Element personElement= (Element) nodeList.item(i);  
  29.                       //获取<person>属性id的值  
  30.                      String id= personElement.getAttribute("id");  
  31.                       Log.i("test",id);  
  32.                       //获取<person>下面的子标签<name><age>的值  
  33.                       Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);  
  34.                       String name= nameElement.getTextContent();  
  35.                       Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);  
  36.                       String age=ageElement.getTextContent();  
  37.                       Log.i("test",name+"  "+age);  
  38.                   }  
  39.             }  
  40.           } catch (MalformedURLException e) {  
  41.               e.printStackTrace();  
  42.           } catch (IOException e) {  
  43.               e.printStackTrace();  
  44.           }catch (SAXException e) {  
  45.               e.printStackTrace();  
  46.           }catch (ParserConfigurationException e) {  
  47.               e.printStackTrace();  
  48.           }  
  49.           return null;  
  50.       }  

第二种SAX解析:

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

Sax解析代码如下

  1. class MyTask extends AsyncTask{  
  2.       @Override  
  3.       protected Object doInBackground(Object[] params) {  
  4.           //获取网络XML数据  
  5.           try {  
  6.               URL url=new URL("http://192.168.1.110:8080/person.xml");  
  7.               HttpURLConnection connection= (HttpURLConnection) url.openConnection();  
  8.               //设置请求方式  
  9.               connection.setRequestMethod("GET");  
  10.               //设置连接超时的时间(优化)  
  11.               connection.setConnectTimeout(5000);  
  12.               //结果码(状态)//成功200   失败 未修改304  
  13.               //获取结果码  
  14.               int code=connection.getResponseCode();  
  15.               if(code==200){  
  16.                   //获取服务器返回来额结果  
  17.                   InputStream is=connection.getInputStream();  
  18.                   //解析XMLSax解析=====================================  
  19.                   //(边读边解析)  
  20.                 SAXParserFactory saxParseFactory=SAXParserFactory.newInstance();  
  21.                 SAXParser saxParse= saxParseFactory.newSAXParser();  
  22.                 saxParse.parse(is,new DefaultHandler(){  
  23.                     @Override  
  24.                     public void startDocument() throws SAXException {  
  25.                         super.startDocument();  
  26.                         Log.i("test","开始文档");  
  27.                     }  
  28.                     @Override  
  29.                     public void endDocument() throws SAXException {  
  30.                         super.endDocument();  
  31.                         Log.i("test","结束文档");  
  32.                     }  
  33.                     @Override  
  34.                     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
  35.                         super.startElement(uri, localName, qName, attributes);  
  36.                         cuurentTag=localName;  
  37.                         //获取开始标签的名字  
  38.                         if("person".equals(localName)){  
  39.                             //取属性的值  
  40.                             String id=attributes.getValue(0);  
  41.                             Log.i("test",id);  
  42.                         }  
  43.                     }  
  44.                     @Override  
  45.                     public void endElement(String uri, String localName, String qName) throws SAXException {  
  46.                         super.endElement(uri, localName, qName);  
  47.                         cuurentTag=null;  
  48.                     }  
  49.                     @Override  
  50.                     public void characters(char[] ch, int start, int length) throws SAXException {  
  51.                         super.characters(ch, start, length);  
  52.                         if("name".equals(cuurentTag)){  
  53.                               //获取<name>的值  
  54.                               String name=new String(ch,start,length);  
  55.                               Log.i("test""   "+name);  
  56.                          }else if("age".equals(cuurentTag)){  
  57.                               //获取<name>的值  
  58.                               String age=new String(ch,start,length);  
  59.                               Log.i("test""   "+age);  
  60.                           }  
  61.                     }  
  62.                 });  
  63.             }  
  64.           } catch (MalformedURLException e) {  
  65.               e.printStackTrace();  
  66.           } catch (IOException e) {  
  67.               e.printStackTrace();  
  68.           } catch (ParserConfigurationException e) {  
  69.               e.printStackTrace();  
  70.           } catch (SAXException e) {  
  71.               e.printStackTrace();  
  72.           }  
  73.           return null;  
  74.       }  

第三种PULL解析(类似SAX)

  1. //异步任务类AsyncTask  
  2.    class MyTask extends AsyncTask{  
  3.        @Override  
  4.        protected Object doInBackground(Object[] params) {  
  5.            //获取网络XML数据  
  6.            try {  
  7.                URL url=new URL("http://192.168.1.110:8080/person.xml");  
  8.                HttpURLConnection connection= (HttpURLConnection) url.openConnection();  
  9.                //设置请求方式  
  10.                connection.setRequestMethod("GET");  
  11.                //设置连接超时的时间(优化)  
  12.                connection.setConnectTimeout(5000);  
  13.                //结果码(状态)//成功200   失败 未修改304  
  14.                //获取结果码  
  15.                int code=connection.getResponseCode();  
  16.                if(code==200){  
  17.                    //获取服务器返回来额结果  
  18.                    InputStream is=connection.getInputStream();  
  19.                    //使用PULL解析  
  20.                    XmlPullParser xmlPullParser= Xml.newPullParser();  
  21.                    xmlPullParser.setInput(is,"UTF-8");  
  22.                    //获取解析的标签的类型  
  23.                    int type=xmlPullParser.getEventType();  
  24.                    while(type!=XmlPullParser.END_DOCUMENT){  
  25.                        switch (type) {  
  26.                            case XmlPullParser.START_TAG:  
  27.                                //获取开始标签的名字  
  28.                                String starttgname = xmlPullParser.getName();  
  29.                                if ("person".equals(starttgname)) {  
  30.                                    //获取id的值  
  31.                                    String id = xmlPullParser.getAttributeValue(0);  
  32.                                    Log.i("test", id);  
  33.                                } else if ("name".equals(starttgname)) {  
  34.                                    String name = xmlPullParser.nextText();  
  35.                                    Log.i("test", name);  
  36.                                } else if ("age".equals(starttgname)) {  
  37.                                    String age = xmlPullParser.nextText();  
  38.                                    Log.i("test", age);  
  39.                                }  
  40.                                break;  
  41.                            case XmlPullParser.END_TAG:  
  42.                                break;  
  43.                        }//细节:  
  44.                        type=xmlPullParser.next();  
  45.                    }  
  46.              }  
  47.              } catch (MalformedURLException e) {  
  48.                e.printStackTrace();  
  49.            } catch (IOException e) {  
  50.                e.printStackTrace();  
  51.            }catch (XmlPullParserException e) {  
  52.                e.printStackTrace();  
  53.            }  
  54.            return null;  
  55.        }  



原创粉丝点击