android DOM、 SAX 、PULL 解析XML---练习
来源:互联网 发布:穿越火线fps软件 编辑:程序博客网 时间:2024/05/22 03:03
主要推荐使用SAX和PULL
SAX解析的特点:
这种解析方法速度快、占用内存少,但是它需要应用程序自己处理解析器的状态,实现起来会比较麻烦,而且它只支持对XML文件的读取,不支持写入。
SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此我们不能控制事件的处理主动结束。
SAX解析是事件驱动的,它不会将整个文档读入内存再解析,而是在读取文档的过程中就会遍历完毕文档中所有的节点解析它,当我们在解析XML文件时,如果只需要文档前边或是中间一小部分数据,使用SAX解析就浪费了处理器资源,这时我们使用PULL解析就非常合适了。
PULL解析:应用程序根据自己的需要控制解析器的读取。这种方式 继承了SAX解析速度快、占用内存少等优点,同时它也保持了接口简单、编程容易等特点。PULL解析器的工作方式为允许应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
使用SAX解析,在解析器解析过程中通过回调把TAB/VALUE值等传给我们,我们可以直接拿到这些值进行比较、处理。而PULL的原理是它只告诉我们一个TAG开始或者结束了,至于TAG/VALUE的值是什么需要我们自己去向解析器问,所以叫做PULL(拉),而SAX看起来是PUSH(推)给我们的。
SAX与PULL之间的区别,PULL是使用一个循环结构,循环体中我们可以随时跳出(break),而SAX不是,SAX是只要开始解析了,就必须解析完成。所以PULL的使用比SAX会更加灵活,在Android的开发中,更推荐使用PULL解析XML。
以上参考:http://m.blog.csdn.net/article/details?id=46831253
下面为则是个人测试代码:
在Java端将数据转为xml的形式 jsp文件中:
<?xml version="1.0" encoding="UTF-8" ?><%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><fqs><c:forEach items="${fqs}" var="fq"> <fq name="${fq.name}"> <content>${fq.content}</content> <time>${fq.time}</time> </fq> </c:forEach> </fqs>
在android端获取XML数据:
public void getXml(View view){ String path="http://192.168.43.135:8080/G150725_S2SH/fqActiongetXML.action"; try { //实例化URL 定义网络数据路径 URL url=new URL(path); //打开连接 HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection(); //设置请求方式 httpURLConnection.setRequestMethod("GET"); //设置连接超时的时间 httpURLConnection.setConnectTimeout(5000); //获取响应码 int code=httpURLConnection.getResponseCode(); if(code==200){//得到数据响应 //获取数据 InputStream is=httpURLConnection.getInputStream(); //测试:打印看是否是所需数据 String str=""; BufferedReader br=new BufferedReader(new InputStreamReader(is)); while((str=br.readLine())!=null){ Log.i("hhhhhh",str); } } //解析XML :DOM SAX PULL(android有的) } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
一、用DOM解析:一次性取出全部的数据进行解析,若数据量多则不建议使用;以下为基础的原码,也可第三方使用DOM4J,使用时代码量少,使用方便。
try { DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder(); Document document=documentBuilder.parse(is); //获取标签 Element root=document.getDocumentElement(); Log.i("hhhhhhh","root:"+root.getTagName()); NodeList nodeList=root.getElementsByTagName("fq"); for (int i=0;i<nodeList.getLength();i++){ Element element= (Element) nodeList.item(i); //获取属性name String name=element.getAttribute("name"); //获取子标签 Element elementC=(Element)element.getElementsByTagName("content").item(0); String ciontent=elementC.getTextContent(); Element elementT= (Element) element.getElementsByTagName("time").item(0); String time=elementT.getTextContent(); Log.i("hhhhhhh",name+" "+time); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); }
二、SAX :
//sax try { 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); //开始标签 local = localName; if("fq".equals(localName)){ fq = new FQ(); String name=attributes.getValue(0); fq.setName(name); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); //结束标签 local=null;//小细节 if ("fq".equals(localName)){ fqs.add(fq); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); //文本内容 包括结束标签和下一个开始标签之间的换行 为空而全局变量不会仍然可能为 content 会导致下面的取值为空 所以在借宿标签中把local=null; if ("content".equals(local)){ String content=new String(ch,start,length); fq.setContent(content); }else if ("time".equals(local)){ String time=new String(ch,start,length); fq.setTime(time); } } }); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); }
三、pull解析:
//PULL try { XmlPullParser pullParser= Xml.newPullParser(); pullParser.setInput(is,"UTF-8"); //得到事件类型 开始文档 int type=pullParser.getEventType(); //不等于结束 while(type!=XmlPullParser.END_DOCUMENT){ switch (type){ case XmlPullParser.START_TAG: //获取开始标签的名字 String startTagName=pullParser.getName(); if("fq".equals(startTagName)){ fq = new FQ(); String name=pullParser.getAttributeValue(0); fq.setName(name); }else if("content".equals(startTagName)){ String content= pullParser.nextText(); fq.setContent(content); }else if("time".equals(startTagName)){ String time= pullParser.nextText(); fq.setTime(time); } break; case XmlPullParser.END_TAG: //获取结束标签的名字 String endTagName=pullParser.getName(); if("fq".equals(endTagName)){ fqs.add(fq); } break; } //下一个 type=pullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); }
- android DOM、 SAX 、PULL 解析XML---练习
- Android SAX,DOM,PULL解析XML文档
- android sax dom pull 解析 xml
- Android中XML解析DOM/SAX/PULL
- Android系列--DOM、SAX、Pull解析XML
- Android系列--DOM、SAX、Pull解析XML
- Android系列--DOM、SAX、Pull解析XML
- Android系列--DOM、SAX、Pull解析XML
- Android系列--DOM、SAX、Pull解析XML
- Android解析XML(SAX DOM PULL)
- Android xml文件解析 SAX,DOM,PULL
- Android系列--DOM、SAX、Pull解析XML
- Android系列--DOM、SAX、Pull解析XML
- Android系列--DOM、SAX、Pull解析XML
- Android-DOM、SAX、PULL解析网络xml
- Android-解析XML(Dom,Sax,Pull)
- Android解析xml(DOM SAX PULL)
- sax、dom、pull解析xml
- android fragment test
- XGBoost推导过程
- 几款开源的hybird移动app框架分析
- CF-Codeforces Round #210 (Div. 1)-A-Levko and Array Recovery
- 同步和阻塞
- android DOM、 SAX 、PULL 解析XML---练习
- (EM算法)The EM Algorithm 和 混合高斯模型Demo(转载)
- Java中String字符串初始化细节
- 小鸦之设计模式(1) -观察者模式
- 蓝桥杯 剪邮票 全排列+DFS
- ## N26--第十六次博客作业
- 关于servlet中getParameterValues()的报错问题
- nexus搭建maven私服
- 使用弱引用的一个例子