Android中数据解析的五种方式

今天小编就为大家分享一篇关于Android中数据解析的五种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

这里有一份XML文件,接下来我们用不同的解析方式来解析这份文件

    愤怒的小鸟Animation2016 叶问3ActionEnglish

1.DOM解析

 //1.创建一个DocumentBuilderFactory对象 DocumentBuilderFactory dBuilderFactory=DocumentBuilderFactory.newInstance(); try { //2.创建一个DocumentBuilder对象 DocumentBuilder dBuilder=dBuilderFactory.newDocumentBuilder(); //3.获取Document对象 Document document=dBuilder.parse("Movie.xml"); System.out.println("解析开始:--------------------------"); //获取Movie元素结点集合 NodeList movies=document.getElementsByTagName("Movie"); System.out.println("共有"+movies.getLength()+"部电影"); //遍历Movie元素结点集合 for(int i=0;i

2.SAX解析

 //1.创建SAXFactory对象 SAXParserFactory sParserFactory=SAXParserFactory .newInstance(); //2.拿到一个SAXParser解析对象 try { SAXParser saxParser=sParserFactory.newSAXParser(); saxParser.parse("Movie.xml",new MyHandler() ); } catch (Exception e) { e.printStackTrace(); }

接下来需要写一个类去继承DefaultHandler,然后一般要重写里面的五个方法:

1)startDocument(),该方法一执行表示解析开始,可以在里面去初始化对象集合

 @Override public void startDocument() throws SAXException { System.out.println("开始解析----------------------------"); movieList=new ArrayList<>(); }

2)startEnement(),该方法一执行表示解析到了开始元素,亦即xml文件里面的Movie标签

 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // if ("Movie".equals(qName)) { movie=new Movie(); count++; System.out.println("正在解析第"+count+"部电影!"); for (int i = 0; i 

3)characters(),在该方法里面去读取元素的值

 @Override public void characters(char[] ch, int start, int length) throws SAXException { value=new String(ch,start,length); if (!value.trim().equals("")) { System.out.println("节点值:"+value); } }

4)endElement(),表示解析到了一个元素的结束标签,在该方法里面可以去 构造对象,最后并且添加到集合里去

 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equals("year")) { movie.setMovieYear(value); } if (qName.equals("type")) { movie.setMovieType(value); } if (qName.equals("language")) { movie.setMovieLanguage(value); } if (qName.equals("name")) { movie.setMovieName(value); } //解析完一个元素时回调 if ("Movie".equals(qName)) { movieList.add(movie); movie=null; System.out.println("第"+count+"部电影解析结束!"); } }

5)endDocument(),当执行到该方法也就表示文件已经解析完毕了

 @Override public void endDocument() throws SAXException { System.out.println("解析结束----------------------------"); System.out.println("解析结果集如下:"); for(int i=0;i

3.PULL解析

pull解析与其它方式不同的是,它需要将xml文件存放在资源文件res下面的xml文件夹下,解析的过程如下:

1)首先拿到一个Pull资源解析器,有时如果通过网络上下载xml文件的话,则需要去构造一个Pull解析器,再将流设置给pull解析器, 接下来就是一样的,一个标签一个标签的去解析

 //拿到一个XMLResourceParser //XmlPullParser parser=Xml.newPullParser(); //parser.setInput(in); XmlResourceParser xmlResourceParser=getResources().getXml(R.xml.movie); //拿到第一个事件类型,也就是最外层的标签 try { int type=xmlResourceParser.getEventType(); while(type!=XmlResourceParser.END_DOCUMENT){ if (type==XmlResourceParser.START_DOCUMENT) { System.out.println("开始解析"); movieList=new ArrayList<>(); } if (type==XmlResourceParser.START_TAG) { if ("Movie".equals(xmlResourceParser.getName())) { movie=new Movie(); String id=xmlResourceParser.getAttributeValue(null, "id"); System.out.println("id:"+id); movie.setMovieId(id); } if ("name".equals(xmlResourceParser.getName())) { //System.out.println("name:"+xmlResourceParser.nextText()+"==========="); movie.setMovieName(xmlResourceParser.nextText()); }else if ("type".equals(xmlResourceParser.getName())) { movie.setMovieType(xmlResourceParser.nextText()); }else if ("year".equals(xmlResourceParser.getName())) { movie.setMovieYear(xmlResourceParser.nextText()); }else if ("language".equals(xmlResourceParser.getName())) { movie.setMovieLanguage(xmlResourceParser.nextText()); } } if (type==XmlResourceParser.END_TAG) { if ("Movie".equals(xmlResourceParser.getName())) { movieList.add(movie); movie=null; } } type=xmlResourceParser.next(); } System.out.println("解析结束"); StringBuffer sBuffer=new StringBuffer(); for (int i = 0; i 

4.Json解析

Json解析的话需要先给出一份JSon数据,就拿下面的数据来解析吧!

 private static final String JSONDATA="{name:张三," + "age:26," + "phone:[131,132]," + "score:{" + "语文:100," + "数学:90," + "理综:{化学:80,物理:70,生物:80}}}";

Json解析的过程无疑就是碰到大括号,就new一个Object出来,中括号就new一个Array出来,再用一个for循环去读取数据:

 StringBuffer stringBuffer=new StringBuffer(); try { //JSONObject jsonObject=new JSONObject(JSONDATA); JSONTokener jsonTokener=new JSONTokener(JSONDATA); JSONObject jsonObject=(JSONObject) jsonTokener.nextValue(); stringBuffer.append("name:"+jsonObject.getString("name")+"\n"); stringBuffer.append("aeg:"+jsonObject.getString("age")+"\n"); JSONArray phoneArray=jsonObject.getJSONArray("phone"); stringBuffer.append("phone:"+phoneArray.getString(0) +"  "+phoneArray.getString(1)+"\n"); JSONObject scoreJsonObject=jsonObject.getJSONObject("score"); stringBuffer.append("语文:"+scoreJsonObject.getString("语文")+"\n") .append("数学:"+scoreJsonObject.getString("数学")); JSONObject lizongObject=scoreJsonObject.getJSONObject("理综"); stringBuffer.append("化学:"+lizongObject.getString("化学")+"\n") .append("物理:"+lizongObject.getString("物理")+"\n") .append("生物:"+lizongObject.getString("生物")); show_tv.setText(stringBuffer.toString()); } catch (Exception e) { e.printStackTrace(); }

5.GSON解析

GSON解析相对来说简单一些,但也有一定的局限性,比如说,数据类的属性字段和key值必须是一一对应的

 //拿GSON去解析数据时,数据类的属性值跟key值必须是对应的 Gson gson=new Gson(); Student student=gson.fromJson(JSONDATA, Student.class);

数据类的属性:

 public String name; public String age; public ArrayList phone=new ArrayList<>(); public ArrayList score=new ArrayList<>(); public class Score{ public String id; public String fenshu; }

总结

以上就是Android中数据解析的五种方式的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 移动