欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中数据解析的五种方式

程序员文章站 2023-12-29 14:08:28
这里有一份xml文件,接下来我们用不同的解析方式来解析这份文件

这里有一份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.创建一个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;i<movies.getlength();i++){
        system.out.println("=====================");
        system.out.println("正在解析"+(i+1)+"部电影!");
        node movie=movies.item(i);
        //获取元素结点的属性集合
        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元素子节点集合
        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("节点名:"+child.getnodename()+"    ");
            //system.out.println("节点值:"+child.getnodevalue());
            system.out.println("节点值:"+child.getfirstchild().getnodevalue());
          }
        }
        system.out.println("第"+(i+1)+"部电影解析结束");
      }
      system.out.println("解析结束--------------------------------");
    } catch (exception e) {
      e.printstacktrace();
    }

2.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<movielist.size();i++){
      system.out.println(movielist.get(i).tostring());
      system.out.println("----------------------------------");
    }
  }

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<string> phone=new arraylist<>();
public arraylist<score> score=new arraylist<>();
public class score{
  public string id;
  public string fenshu;
}

总结

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

上一篇:

下一篇: