栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android中数据解析的五种方式

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android中数据解析的五种方式

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



  
    愤怒的小鸟
    Animation
    2016
  
  
    叶问3
    Action
    English
  

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;i2.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 < 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("节点值:"+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 < 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数据,就拿下面的数据来解析吧!

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;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对考高分网的支持。如果你想了解更多相关内容请查看下面相关链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/154997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号