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