android 三种方式解析网络上的XML
2017-02-18 11:11
417 查看
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
下面是具体的实现代码:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
下面是具体的实现代码:
public class MainActivity extends AppCompatActivity { private String cuurentTag=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void parseXML(View view){ new MyTask().execute(); } //线程间通信机制 //子线程+Handler //异步任务类 AsyncTask class MyTask extends AsyncTask{ @Override protected Object doInBackground(Object[] objects) { //获取网络XML数据 //原生态底层: //URLConnection try { URL url=new URL("http://192.168.43.135/persons.xml"); HttpURLConnection connection= (HttpURLConnection) url.openConnection(); //设置请求方式‘ connection.setRequestMethod("GET"); //设置请求连接超时的时间(优化) connection.setConnectTimeout(5000); //获取结果码 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); // } //解析XML //01.使用DOM解析 // DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); // DocumentBuilder document c0e9 Builder=documentBuilderFactory.newDocumentBuilder(); // Document document=documentBuilder.parse(is); // //获取跟标签 // Element root=document.getDocumentElement(); // Log.i("test","跟标签:"+root.getNodeName()); // // //获取<persons>下面的所有的子标签<person> // NodeList nodeList=root.getElementsByTagName("person"); // for (int i = 0; i <nodeList.getLength() ; i++) { // //获取单个 // //Node // //Element // Element personElement= (Element) nodeList.item(i); // //获取<person>属性id的值 // String id=personElement.getAttribute("id"); // Log.i("test",id); // // //获取<person>下面的子标签<name><age><image>的值 // Element nameElement= (Element) personElement.getElementsByTagName("name").item(0); // String name=nameElement.getTextContent(); // Element ageElement= (Element) personElement.getElementsByTagName("age").item(0); // String age=ageElement.getTextContent(); // Element imageElement= (Element) personElement.getElementsByTagName("image").item(0); // String image=imageElement.getTextContent(); // // Log.i("test",name+" "+age+" "+image); // } //02.SAX(边读边解析,基于事件(方法)驱动方式) // SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); // SAXParser saxParser=saxParserFactory.newSAXParser(); // // saxParser.parse(is,new DefaultHandler(){ // @Override // public void startDocument() throws SAXException { // super.startDocument(); // } // // @Override // public void endDocument() throws SAXException { // super.endDocument(); // } // // @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); // }else if("image".equals(cuurentTag)){ // //获取<name>的值 // String image=new String(ch,start,length); // Log.i("test", " "+image); // } // } // }); //03.使用PULL解析(类似SAX) 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 starttagName=xmlPullParser.getName(); if("person".equals(starttagName)){ //获取id的值 String id=xmlPullParser.getAttributeValue(0); Log.i("test",id); }else if("name".equals(starttagName)){ String name=xmlPullParser.nextText(); Log.i("test",name); }else if("age".equals(starttagName)){ String age=xmlPullParser.nextText(); Log.i("test",age); }else if("image".equals(starttagName)){ String image=xmlPullParser.nextText(); Log.i("test",image); } break; case XmlPullParser.END_TAG: break; } //细节: type=xmlPullParser.next(); } } //结果码(状态) //成功:200 // //未修改:304 } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } // catch (ParserConfigurationException e) { // e.printStackTrace(); // } catch (SAXException e) { // e.printStackTrace(); // } // catch (ParserConfigurationException e) { // e.printStackTrace(); // } catch (SAXException e) { // e.printStackTrace(); // } //02.解析XML //03.展示 return null; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); //展示 } } }
相关文章推荐
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- Android中的三种XML解析方式
- 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML的三种方式(DOM,SAX,PULL)
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)
- 【Android网络开发の1】XML之DOM方式 解析和生成XML文件 推荐
- 【Android网络开发の3】XML之PULL方式 解析和生成XML文件
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android解析XML三种方式(PULL、SAX、DOM)
- Android平台中实现对XML的三种解析方式(DOM 、PULL、 SAX)
- 在Android平台中实现对XML的三种解析方式。
- 【Android网络开发の2】XML之SAX方式 解析和生成XML文件
- Android解析XML的三种方式
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- 详解android解析Xml的三种方式——DOM、SAX以及XMLpull
- android解析XML总结(SAX、Pull、Dom三种方式)