Android中數(shù)據(jù)解析的五種方式
這里有一份XML文件,接下來我們用不同的解析方式來解析這份文件
<?xml version="1.0" encoding="UTF-8"?> <Movies> <Movie id="1"> <name>憤怒的小鳥</name> <type>Animation</type> <year>2016</year> </Movie> <Movie id="2"> <name>葉問3</name> <type>Action</type> <language>English</language> </Movie> </Movies>
1.DOM解析
//1.創(chuàng)建一個(gè)DocumentBuilderFactory對(duì)象 DocumentBuilderFactory dBuilderFactory=DocumentBuilderFactory.newInstance(); try { //2.創(chuàng)建一個(gè)DocumentBuilder對(duì)象 DocumentBuilder dBuilder=dBuilderFactory.newDocumentBuilder(); //3.獲取Document對(duì)象 Document document=dBuilder.parse("Movie.xml"); System.out.println("解析開始:--------------------------"); //獲取Movie元素結(jié)點(diǎn)集合 NodeList movies=document.getElementsByTagName("Movie"); System.out.println("共有"+movies.getLength()+"部電影"); //遍歷Movie元素結(jié)點(diǎn)集合 for(int i=0;i<movies.getLength();i++){ System.out.println("====================="); System.out.println("正在解析"+(i+1)+"部電影!"); Node movie=movies.item(i); //獲取元素結(jié)點(diǎn)的屬性集合 NamedNodeMap attrs=movie.getAttributes(); for(int j=0;j<attrs.getLength();j++){ Node attr=attrs.item(j); System.out.print("屬性名為:"+attr.getNodeName()+" "); System.out.println("屬性值為:"+attr.getNodeValue()); } //獲取movie元素子節(jié)點(diǎn)集合 NodeList childNodes=movie.getChildNodes(); for(int k=0;k<childNodes.getLength();k++){ Node child=childNodes.item(k); if (child.getNodeType()==Document.ELEMENT_NODE) { System.out.println("節(jié)點(diǎn)名:"+child.getNodeName()+" "); //System.out.println("節(jié)點(diǎn)值:"+child.getNodeValue()); System.out.println("節(jié)點(diǎn)值:"+child.getFirstChild().getNodeValue()); } } System.out.println("第"+(i+1)+"部電影解析結(jié)束"); } System.out.println("解析結(jié)束--------------------------------"); } catch (Exception e) { e.printStackTrace(); }
2.SAX解析
//1.創(chuàng)建SAXFactory對(duì)象 SAXParserFactory sParserFactory=SAXParserFactory .newInstance(); //2.拿到一個(gè)SAXParser解析對(duì)象 try { SAXParser saxParser=sParserFactory.newSAXParser(); saxParser.parse("Movie.xml",new MyHandler() ); } catch (Exception e) { e.printStackTrace(); }
接下來需要寫一個(gè)類去繼承DefaultHandler,然后一般要重寫里面的五個(gè)方法:
1)startDocument(),該方法一執(zhí)行表示解析開始,可以在里面去初始化對(duì)象集合
@Override public void startDocument() throws SAXException { System.out.println("開始解析----------------------------"); movieList=new ArrayList<>(); }
2)startEnement(),該方法一執(zhí)行表示解析到了開始元素,亦即xml文件里面的Movie標(biāo)簽
@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 < attributes.getLength(); i++) { //拿到屬性名和屬性值 System.out.print("屬性名:"+attributes.getQName(i)+" "); System.out.println("屬性值:"+attributes.getValue(i)); if (attributes.getQName(i).equals("id")) { movie.setMovieId(attributes.getValue(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("節(jié)點(diǎn)值:"+value); } }
4)endElement(),表示解析到了一個(gè)元素的結(jié)束標(biāo)簽,在該方法里面可以去 構(gòu)造對(duì)象,最后并且添加到集合里去
@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); } //解析完一個(gè)元素時(shí)回調(diào) if ("Movie".equals(qName)) { movieList.add(movie); movie=null; System.out.println("第"+count+"部電影解析結(jié)束!"); } }
5)endDocument(),當(dāng)執(zhí)行到該方法也就表示文件已經(jīng)解析完畢了
@Override public void endDocument() throws SAXException { System.out.println("解析結(jié)束----------------------------"); System.out.println("解析結(jié)果集如下:"); for(int i=0;i<movieList.size();i++){ System.out.println(movieList.get(i).toString()); System.out.println("----------------------------------"); } }
3.PULL解析
pull解析與其它方式不同的是,它需要將xml文件存放在資源文件res下面的xml文件夾下,解析的過程如下:
1)首先拿到一個(gè)Pull資源解析器,有時(shí)如果通過網(wǎng)絡(luò)上下載xml文件的話,則需要去構(gòu)造一個(gè)Pull解析器,再將流設(shè)置給pull解析器, 接下來就是一樣的,一個(gè)標(biāo)簽一個(gè)標(biāo)簽的去解析
//拿到一個(gè)XMLResourceParser //XmlPullParser parser=Xml.newPullParser(); //parser.setInput(in); XmlResourceParser xmlResourceParser=getResources().getXml(R.xml.movie); //拿到第一個(gè)事件類型,也就是最外層的標(biāo)簽 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("解析結(jié)束"); StringBuffer sBuffer=new StringBuffer(); for (int i = 0; i < movieList.size(); i++) { sBuffer.append(movieList.get(i).toString()) .append("\n"); } show_tv.setText(sBuffer.toString()); } catch (Exception e) { e.printStackTrace(); }
4.Json解析
Json解析的話需要先給出一份JSon數(shù)據(jù),就拿下面的數(shù)據(jù)來解析吧!
private static final String JSONDATA="{name:張三," + "age:26," + "phone:[131,132]," + "score:{" + "語文:100," + "數(shù)學(xué):90," + "理綜:{化學(xué):80,物理:70,生物:80}}}";
Json解析的過程無疑就是碰到大括號(hào),就new一個(gè)Object出來,中括號(hào)就new一個(gè)Array出來,再用一個(gè)for循環(huán)去讀取數(shù)據(jù):
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("數(shù)學(xué):"+scoreJsonObject.getString("數(shù)學(xué)")); JSONObject lizongObject=scoreJsonObject.getJSONObject("理綜"); stringBuffer.append("化學(xué):"+lizongObject.getString("化學(xué)")+"\n") .append("物理:"+lizongObject.getString("物理")+"\n") .append("生物:"+lizongObject.getString("生物")); show_tv.setText(stringBuffer.toString()); } catch (Exception e) { e.printStackTrace(); }
5.GSON解析
GSON解析相對(duì)來說簡單一些,但也有一定的局限性,比如說,數(shù)據(jù)類的屬性字段和key值必須是一一對(duì)應(yīng)的
//拿GSON去解析數(shù)據(jù)時(shí),數(shù)據(jù)類的屬性值跟key值必須是對(duì)應(yīng)的 Gson gson=new Gson(); Student student=gson.fromJson(JSONDATA, Student.class);
數(shù)據(jù)類的屬性:
public String name; public String age; public ArrayList<String> phone=new ArrayList<>(); public ArrayList<Score> score=new ArrayList<>(); public class Score{ public String id; public String fenshu; }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- Android獲取當(dāng)前應(yīng)用分配的最大內(nèi)存和目前使用內(nèi)存的方法
- Android手機(jī)獲取Mac地址的幾種方法
- Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法
- Android調(diào)試神器stetho使用詳解和改造
- Android Java調(diào)用自己C++類庫的實(shí)例講解
- Android可自定義神奇動(dòng)效的卡片切換視圖實(shí)例
- Android添加音頻的幾種方法
- Android線程中Handle的使用講解
- Android亮屏速度分析總結(jié)
- Android四大組件之Service詳解
相關(guān)文章
android獲取照片的快照 思路及實(shí)現(xiàn)方法
android獲取照片的快照 思路及實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-06-06Android編程實(shí)現(xiàn)對(duì)電池狀態(tài)的監(jiān)視功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)對(duì)電池狀態(tài)的監(jiān)視功能,涉及Android基于廣播實(shí)現(xiàn)針對(duì)電源電量的判定與監(jiān)視技巧,需要的朋友可以參考下2016-11-11Android編程實(shí)現(xiàn)自定義title功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義title功能,結(jié)合具體實(shí)例形式分析了Android自定義title的具體實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-03-03Android中加載網(wǎng)絡(luò)資源時(shí)的優(yōu)化可使用(線程+緩存)解決
Android 中加載網(wǎng)絡(luò)資源時(shí)的優(yōu)化;基本的思路是線程+緩存來解決,具體解決思路如下,有類似情況的朋友可以參考下哈2013-06-06Android基礎(chǔ)開發(fā)小案例之短信發(fā)送器
這篇文章主要為大家詳細(xì)介紹了Android基礎(chǔ)開發(fā)小案例之短信發(fā)送器的具體實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-05-05Android中SharedPreference詳解及簡單實(shí)例
這篇文章主要介紹了 Android中SharedPreference詳解及簡單實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09