Android解析XML的三种方式
16lz
2021-12-04
在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式.
如图:
本篇博客使用的xml文件如下:(这里是获取网络XML)person.xml
<?xml version="1.0" encoding="UTF-8"?> zhangsan 21 lisi 22 wangwu 222
下面分别介绍三种解析方式。
第一种: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: zhangsan 02-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: lisi 02-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: wangwu 02-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; }
打印信息如下:
更多相关文章
- 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
- Android(安卓)中如何获取editText文本信息
- git 获取android source
- Android(安卓)MaterialList源码解析
- 从Android到Swift iOS开发:语言与框架对比
- Android(安卓)studio 获取应用签名
- AsyncTask使用和源码解析
- android 获取文件夹、文件的大小 以B、KB、MB、GB 为单位
- [Android] 获取Android设备的唯一识别码|设备号|序号|UUID