最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年02月22日 11:26:30   作者:baidu_32877851  
今天小編就為大家分享一篇關(guān)于Android中數(shù)據(jù)解析的五種方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

這里有一份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)建一個DocumentBuilderFactory對象
    DocumentBuilderFactory dBuilderFactory=DocumentBuilderFactory.newInstance();
    try {
      //2.創(chuàng)建一個DocumentBuilder對象
      DocumentBuilder dBuilder=dBuilderFactory.newDocumentBuilder();
      //3.獲取Document對象
      Document document=dBuilder.parse("Movie.xml");
      System.out.println("解析開始:--------------------------");
      //獲取Movie元素結(jié)點集合
      NodeList movies=document.getElementsByTagName("Movie");
      System.out.println("共有"+movies.getLength()+"部電影");
      //遍歷Movie元素結(jié)點集合
      for(int i=0;i<movies.getLength();i++){
        System.out.println("=====================");
        System.out.println("正在解析"+(i+1)+"部電影!");
        Node movie=movies.item(i);
        //獲取元素結(jié)點的屬性集合
        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é)點集合
        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é)點名:"+child.getNodeName()+"    ");
            //System.out.println("節(jié)點值:"+child.getNodeValue());
            System.out.println("節(jié)點值:"+child.getFirstChild().getNodeValue());
          }
        }
        System.out.println("第"+(i+1)+"部電影解析結(jié)束");
      }
      System.out.println("解析結(jié)束--------------------------------");
    } catch (Exception e) {
      e.printStackTrace();
    }

2.SAX解析

//1.創(chuàng)建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(),該方法一執(zhí)行表示解析開始,可以在里面去初始化對象集合

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

2)startEnement(),該方法一執(zhí)行表示解析到了開始元素,亦即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 < 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é)點值:"+value);
    }
  }

4)endElement(),表示解析到了一個元素的結(jié)束標簽,在該方法里面可以去 構(gòu)造對象,最后并且添加到集合里去

@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);
    }
    //解析完一個元素時回調(diào)
    if ("Movie".equals(qName)) {
      movieList.add(movie);
      movie=null;
      System.out.println("第"+count+"部電影解析結(jié)束!");
    }
  }

5)endDocument(),當執(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)首先拿到一個Pull資源解析器,有時如果通過網(wǎng)絡(luò)上下載xml文件的話,則需要去構(gòu)造一個Pull解析器,再將流設(shè)置給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("解析結(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解析的過程無疑就是碰到大括號,就new一個Object出來,中括號就new一個Array出來,再用一個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解析相對來說簡單一些,但也有一定的局限性,比如說,數(shù)據(jù)類的屬性字段和key值必須是一一對應(yīng)的

//拿GSON去解析數(shù)據(jù)時,數(shù)據(jù)類的屬性值跟key值必須是對應(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)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Android4.0.x Home鍵事件攔截監(jiān)聽的方法

    Android4.0.x Home鍵事件攔截監(jiān)聽的方法

    這篇文章主要介紹了Android4.0.x Home鍵事件攔截監(jiān)聽的方法,對比分析了2.3.x的實現(xiàn)方法,分析了4.0.x實現(xiàn)Home鍵事件攔截監(jiān)聽的相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • Android 吸入動畫效果實現(xiàn)分解

    Android 吸入動畫效果實現(xiàn)分解

    如何在Android上面實現(xiàn)一個類似的效果。先看看我實現(xiàn)的效果圖,我們利用了Canvas.drawBitmapMesh()方法,具體實現(xiàn)代碼如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android實現(xiàn)可收縮和擴展的TextView

    Android實現(xiàn)可收縮和擴展的TextView

    這篇文章主要為大家詳細介紹了Android實現(xiàn)可收縮和擴展的TextView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 常用Android布局文件優(yōu)化技巧總結(jié)

    常用Android布局文件優(yōu)化技巧總結(jié)

    Android布局加載是Android應(yīng)用程序的重要組成部分,布局加載是指將 XML文件中定義的視圖層次結(jié)構(gòu)加載到內(nèi)存中,在這篇文章中,我們將深入探討 Android 布局加載的原理,包括 Android 布局文件的結(jié)構(gòu)和布局文件的常見問題等方面,需要的朋友可以參考下
    2023-07-07
  • android安裝后啟動出錯解決

    android安裝后啟動出錯解決

    大家好,本篇文章主要講的是android安裝后啟動出錯解決,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Android自定義View實現(xiàn)水平帶數(shù)字百分比進度條

    Android自定義View實現(xiàn)水平帶數(shù)字百分比進度條

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)水平帶數(shù)字百分比進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android基于自帶的DownloadManager實現(xiàn)下載功能示例

    Android基于自帶的DownloadManager實現(xiàn)下載功能示例

    這篇文章主要介紹了Android基于自帶的DownloadManager實現(xiàn)下載功能,結(jié)合實例形式分析了DownloadManager實現(xiàn)下載功能的具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下
    2017-08-08
  • Android頂部(toolbar)搜索框?qū)崿F(xiàn)的實例詳解

    Android頂部(toolbar)搜索框?qū)崿F(xiàn)的實例詳解

    這篇文章主要介紹了Android頂部(toolbar)搜索框?qū)崿F(xiàn)的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Android實現(xiàn)實時滑動ViewPager的2種方式

    Android實現(xiàn)實時滑動ViewPager的2種方式

    這篇文章主要為大家詳細介紹了Android實現(xiàn)實時滑動ViewPager的2種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Flutter?文字中劃線動畫StrikeThroughTextAnimation

    Flutter?文字中劃線動畫StrikeThroughTextAnimation

    這篇文章主要為大家介紹了Flutter?文字中劃線動畫StrikeThroughTextAnimation示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論

五大连池市| 巴楚县| 丰县| 聂荣县| 陇南市| 平顺县| 巨野县| 建水县| 日照市| 华阴市| 孟连| 内丘县| 利川市| 信阳市| 渝中区| 聂荣县| 会泽县| 临城县| 永宁县| 鲁甸县| 廉江市| 龙州县| 绵竹市| 颍上县| 扎赉特旗| 建昌县| 平遥县| 金阳县| 涡阳县| 商洛市| 深圳市| 永清县| 卫辉市| 花莲县| 博白县| 承德市| 韶山市| 洛隆县| 南涧| 繁峙县| 岱山县|