Android中数据解析的五种方式
这里有一份XML文件,接下来我们用不同的解析方式来解析这份文件
愤怒的小鸟 Animation 2016 叶问3 Action English
1.DOM解析
//1.创建一个DocumentBuilderFactory对象 DocumentBuilderFactorydBuilderFactory=DocumentBuilderFactory.newInstance(); try{ //2.创建一个DocumentBuilder对象 DocumentBuilderdBuilder=dBuilderFactory.newDocumentBuilder(); //3.获取Document对象 Documentdocument=dBuilder.parse("Movie.xml"); System.out.println("解析开始:--------------------------"); //获取Movie元素结点集合 NodeListmovies=document.getElementsByTagName("Movie"); System.out.println("共有"+movies.getLength()+"部电影"); //遍历Movie元素结点集合 for(inti=0;i2.SAX解析
//1.创建SAXFactory对象 SAXParserFactorysParserFactory=SAXParserFactory.newInstance(); //2.拿到一个SAXParser解析对象 try{ SAXParsersaxParser=sParserFactory.newSAXParser(); saxParser.parse("Movie.xml",newMyHandler()); }catch(Exceptione){ e.printStackTrace(); }接下来需要写一个类去继承DefaultHandler,然后一般要重写里面的五个方法:
1)startDocument(),该方法一执行表示解析开始,可以在里面去初始化对象集合
@Override publicvoidstartDocument()throwsSAXException{ System.out.println("开始解析----------------------------"); movieList=newArrayList<>(); }2)startEnement(),该方法一执行表示解析到了开始元素,亦即xml文件里面的Movie标签
@Override publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{ // if("Movie".equals(qName)){ movie=newMovie(); count++; System.out.println("正在解析第"+count+"部电影!"); for(inti=0;i3)characters(),在该方法里面去读取元素的值
@Override publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{ value=newString(ch,start,length); if(!value.trim().equals("")){ System.out.println("节点值:"+value); } }4)endElement(),表示解析到了一个元素的结束标签,在该方法里面可以去构造对象,最后并且添加到集合里去
@Override publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{ 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 publicvoidendDocument()throwsSAXException{ System.out.println("解析结束----------------------------"); System.out.println("解析结果集如下:"); for(inti=0;i3.PULL解析
pull解析与其它方式不同的是,它需要将xml文件存放在资源文件res下面的xml文件夹下,解析的过程如下:
1)首先拿到一个Pull资源解析器,有时如果通过网络上下载xml文件的话,则需要去构造一个Pull解析器,再将流设置给pull解析器,接下来就是一样的,一个标签一个标签的去解析
//拿到一个XMLResourceParser //XmlPullParserparser=Xml.newPullParser(); //parser.setInput(in); XmlResourceParserxmlResourceParser=getResources().getXml(R.xml.movie); //拿到第一个事件类型,也就是最外层的标签 try{ inttype=xmlResourceParser.getEventType(); while(type!=XmlResourceParser.END_DOCUMENT){ if(type==XmlResourceParser.START_DOCUMENT){ System.out.println("开始解析"); movieList=newArrayList<>(); } if(type==XmlResourceParser.START_TAG){ if("Movie".equals(xmlResourceParser.getName())){ movie=newMovie(); Stringid=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()); }elseif("type".equals(xmlResourceParser.getName())){ movie.setMovieType(xmlResourceParser.nextText()); }elseif("year".equals(xmlResourceParser.getName())){ movie.setMovieYear(xmlResourceParser.nextText()); }elseif("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("解析结束"); StringBuffersBuffer=newStringBuffer(); for(inti=0;i4.Json解析
Json解析的话需要先给出一份JSon数据,就拿下面的数据来解析吧!
privatestaticfinalStringJSONDATA="{name:张三," +"age:26," +"phone:[131,132]," +"score:{" +"语文:100," +"数学:90," +"理综:{化学:80,物理:70,生物:80}}}";Json解析的过程无疑就是碰到大括号,就new一个Object出来,中括号就new一个Array出来,再用一个for循环去读取数据:
StringBufferstringBuffer=newStringBuffer(); try{ //JSONObjectjsonObject=newJSONObject(JSONDATA); JSONTokenerjsonTokener=newJSONTokener(JSONDATA); JSONObjectjsonObject=(JSONObject)jsonTokener.nextValue(); stringBuffer.append("name:"+jsonObject.getString("name")+"\n"); stringBuffer.append("aeg:"+jsonObject.getString("age")+"\n"); JSONArrayphoneArray=jsonObject.getJSONArray("phone"); stringBuffer.append("phone:"+phoneArray.getString(0) +""+phoneArray.getString(1)+"\n"); JSONObjectscoreJsonObject=jsonObject.getJSONObject("score"); stringBuffer.append("语文:"+scoreJsonObject.getString("语文")+"\n") .append("数学:"+scoreJsonObject.getString("数学")); JSONObjectlizongObject=scoreJsonObject.getJSONObject("理综"); stringBuffer.append("化学:"+lizongObject.getString("化学")+"\n") .append("物理:"+lizongObject.getString("物理")+"\n") .append("生物:"+lizongObject.getString("生物")); show_tv.setText(stringBuffer.toString()); }catch(Exceptione){ e.printStackTrace(); }5.GSON解析
GSON解析相对来说简单一些,但也有一定的局限性,比如说,数据类的属性字段和key值必须是一一对应的
//拿GSON去解析数据时,数据类的属性值跟key值必须是对应的 Gsongson=newGson(); Studentstudent=gson.fromJson(JSONDATA,Student.class);数据类的属性:
publicStringname; publicStringage; publicArrayListphone=newArrayList<>(); publicArrayList score=newArrayList<>(); publicclassScore{ publicStringid; publicStringfenshu; } 总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接