Android 常见的几种解析XML 的方式
来源:互联网 发布:golang开发是什么 编辑:程序博客网 时间:2024/05/23 23:47
Android 常见的几种解析XML 的三种方式(Dom SAX pull) 那么这三种方式也有着他们的区别
常规在pc端开发我们使用Dom相对轻松些,因为Dom是基于树形结构的节点或信息片段,允许开发人员使用Dom API遍历XML树,检索所需数据。分析该结构通常需要接在整个文档和构造树形结构,然后才可以检索和更新节点。但是对于特别大的文档解析和加载整个文档会很耗支援。
而SAX解析器是一种基于事件的解析器,它的读取是单向的它的核心是事件处理模式 解析完完后不占内存空间,解析属性方便,但缺点就是对于嵌套多个分支来说处理不是很方便,而Dom方式会把整个XML加载到内存中去, Pull解析器和SAX类似都是基于事件的模式
Pul解析器小巧轻便解析速度快简单易用非常适合在Android移动设备中使用但Pull也常常用在J2ME对于节点处理比较好,类似SAX同样很节省内存在J2ME中我们经常使用的KXML库来解析
下面就用了三种方式来解析自己写的一个person.x
开始我是先做好了网络环境的配置 先启动tomcat 在拿到你的无线局域网的IP地址 (这时你的电脑和你的手机或者是模拟器必须连得是同一个无线局域网)
这样就可以在浏览器上拿到我们XML
然后开始进行代码部分了 对了还要在嵌套文件配置网络的权限
<!--网络权限--><uses-permission android:name="android.permission.INTERNET"></uses-permission>
public void parseXML(View view){ new MyTask().execute(); } //线程间通信机制 //子线程+Handler //异步任务类 AsyncTask class MyTask extends AsyncTask{ @Override protected Object doInBackground(Object[] objects) { //01.获取网络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); }
获取网络数据并且打印
开始我们的Dom 解析
//01.使用DOM解析 DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder=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); }SAX解析
//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); } } });
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 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();// }@Override protected void onPostExecute(Object o) { super.onPostExecute(o); //展示 } }
return null; }
0 0
- Android 常见的几种解析XML 的方式
- 几种常见的xml解析方式 SAX,DOM,PULL以android为例
- Android中常见的XML解析方式
- 回顾Android中解析XML的几种方式
- Android 几种解析XML文件方式的区别
- Android中解析xml的几种方式
- Android几种解析XML方式的比较
- Android下XML解析的几种方式
- Android中解析xml文件的几种方式
- Android几种解析XML方式的比较
- 几种解析的xml的方式
- 四种常见的XML解析方式
- XML解析的常见方式
- XML文档的几种解析方式
- 解析xml几种方式的比较
- java解析xml的几种方式
- java解析xml的几种方式
- java解析xml的几种方式
- 如何修改myeclipse中的字符集为utf-8
- 射线与三角形求交
- 动态规划之多重部分和问题
- arm-linux编译内核提示 Unable to find the ncurses libraries解决办法
- 多线程同步方法:临界区、事件、信号量、互斥对象
- Android 常见的几种解析XML 的方式
- Win8.1+VS2010环境下Qt4.8.7编译
- 白平衡算法
- 类型转换
- opencv之直方图
- 半平面求交
- java 模拟省略号分页
- mysql 创建用户并赋予用户权限
- phpcms分页查询