a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 系統(tǒng) > Android > 正文

Android中數(shù)據(jù)解析的五種方式

2019-10-21 21:25:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這里有一份XML文件,接下來(lái)我們用不同的解析方式來(lái)解析這份文件

<?xml version="1.0" encoding="UTF-8"?><Movies>  <Movie id="1">    <name>憤怒的小鳥(niǎo)</name>    <type>Animation</type>    <year>2016</year>  </Movie>  <Movie id="2">    <name>葉問(wèn)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("解析開(kāi)始:--------------------------");      //獲取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();    }

接下來(lái)需要寫(xiě)一個(gè)類(lèi)去繼承DefaultHandler,然后一般要重寫(xiě)里面的五個(gè)方法: 

1)startDocument(),該方法一執(zhí)行表示解析開(kāi)始,可以在里面去初始化對(duì)象集合

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

2)startEnement(),該方法一執(zhí)行表示解析到了開(kāi)始元素,亦即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文件夾下,解析的過(guò)程如下: 

1)首先拿到一個(gè)Pull資源解析器,有時(shí)如果通過(guò)網(wǎng)絡(luò)上下載xml文件的話,則需要去構(gòu)造一個(gè)Pull解析器,再將流設(shè)置給pull解析器, 接下來(lái)就是一樣的,一個(gè)標(biāo)簽一個(gè)標(biāo)簽的去解析

//拿到一個(gè)XMLResourceParser    //XmlPullParser parser=Xml.newPullParser();    //parser.setInput(in);    XmlResourceParser xmlResourceParser=getResources().getXml(R.xml.movie);    //拿到第一個(gè)事件類(lèi)型,也就是最外層的標(biāo)簽    try {      int type=xmlResourceParser.getEventType();      while(type!=XmlResourceParser.END_DOCUMENT){        if (type==XmlResourceParser.START_DOCUMENT) {          System.out.println("開(kāi)始解析");          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ù)來(lái)解析吧!

private static final String JSONDATA="{name:張三,"      + "age:26,"      + "phone:[131,132],"      + "score:{"      + "語(yǔ)文:100,"      + "數(shù)學(xué):90,"      + "理綜:{化學(xué):80,物理:70,生物:80}}}";

Json解析的過(guò)程無(wú)疑就是碰到大括號(hào),就new一個(gè)Object出來(lái),中括號(hào)就new一個(gè)Array出來(lái),再用一個(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("語(yǔ)文:"+scoreJsonObject.getString("語(yǔ)文")+"/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ì)來(lái)說(shuō)簡(jiǎn)單一些,但也有一定的局限性,比如說(shuō),數(shù)據(jù)類(lèi)的屬性字段和key值必須是一一對(duì)應(yīng)的

//拿GSON去解析數(shù)據(jù)時(shí),數(shù)據(jù)類(lèi)的屬性值跟key值必須是對(duì)應(yīng)的    Gson gson=new Gson();    Student student=gson.fromJson(JSONDATA, Student.class);

數(shù)據(jù)類(lèi)的屬性:

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é)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美1区 | 免费一区二区三区 | 国产二区精品 | 在线国产区 | 免费观看亚洲 | 免费一级在线观看 | 国产视频久久久 | 999久久久国产999久久久 | 午夜影院免费观看视频 | 国产精品久久久久久久久久妞妞 | 91视频免费网站 | 一级片网 | 精产国产伦理一二三区 | 欧美一级三级 | 欧美全黄| 亚洲欧美国产精品久久久久 | 成人免费福利 | 操碰97| 国产一区二区三区精品在线 | 久久色网| 亚洲一级黄色片子 | 日韩成人在线播放 | 久久久久久久久中文字幕 | 久久综合久色欧美综合狠狠 | 黄色国产精品 | 日韩久久网| 久久亚洲一区 | 欧美一区二区三区免费电影 | 日韩欧美~中文字幕 | 国产精品精品 | 成人国产精品久久久 | 中国一级特黄毛片大片 | 一区二区三区在线 | 欧 | 国产不卡视频在线观看 | 亚洲中出 | 黄色免费看| 国产精品久久久久蜜臀 | 在线免费精品 | 91精品一区二区三区久久久久久 | 99久久精品国产一区二区三区 | 欧美色综合一区二区三区 |