XML解析之Pull
发布时间:2020-12-16 05:51:47 所属栏目:百科 来源:网络整理
导读:截了图居然添加不了,不知是不是51的bug呀!!!在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开
截了图居然添加不了,不知是不是51的bug呀!!! 在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。 其实以上描述,就是对整个解析步骤的一个描述,看看代码吧 packagecom.example.testxml; importjava.io.File; importjava.io.FileOutputStream; importjava.io.InputStream; importjava.util.List; importcom.example.ParserInterface.StudentInfo; importcom.example.XMLParser.PullScoreParser; importandroid.os.Bundle; importandroid.os.Environment; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; importandroid.app.Activity; publicclassMainActivityextendsActivityimplementsOnClickListener{ privateList<StudentInfo>list; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((Button)findViewById(R.id.button1)).setOnClickListener(this); ((Button)findViewById(R.id.button2)).setOnClickListener(this); } privatevoidreadXML(){ try{ InputStreamis=getAssets().open("XMLTest.xml"); PullScoreParserpsp=newPullScoreParser(); list=psp.parseXML(is); StringBuffersb=newStringBuffer(); for(StudentInfostu:list){ Log.v("result",stu.toString()); sb.append(stu.toString()+"n"); } ((TextView)findViewById(R.id.textView1)).setText(sb); }catch(Exceptione){ e.printStackTrace(); } } privatebooleanserivalXML(){ try{ Filefile=newFile(Environment.getExternalStorageDirectory(),"XMLTest.xml");//根目录下 FileOutputStreamfos=newFileOutputStream(file.getAbsoluteFile(),false); PullScoreParserpsp=newPullScoreParser(); Stringbuf=psp.serialize(list); fos.write(buf.getBytes()); fos.flush(); fos.close(); }catch(Exceptione){ e.printStackTrace(); returnfalse; } returntrue; } @Override publicvoidonClick(Viewarg0){ if(arg0.getId()==R.id.button1){ readXML(); }elseif(arg0.getId()==R.id.button2){ if(serivalXML()){ ((TextView)findViewById(R.id.textView1)).setText("已生成xml文件,保存在SD卡根目录下"); }else{ ((TextView)findViewById(R.id.textView1)).setText("xml文件生成失败"); } } } } packagecom.example.ParserInterface; importjava.io.InputStream; importjava.util.List; publicinterfaceScoreParser{ /** *解析输入流 */ publicList<StudentInfo>parseXML(InputStreamis)throwsException; /** *序列化StudentInfo对象集合 *得到XML形式的字符串 */ publicStringserialize(List<StudentInfo>list)throwsException; } packagecom.example.ParserInterface; publicclassStudentInfo{ privateStringname; privateStringnum; privatedoublescore; publicStudentInfo(){ } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetNum(){ returnnum; } publicvoidsetNum(Stringnum){ this.num=num; } publicdoublegetScore(){ returnscore; } publicvoidsetScore(doublescore){ this.score=score; } publicStringtoString(){ return"name:"+name+"num:"+num+"score:"+score; } } packagecom.example.XMLParser; importjava.io.InputStream; importjava.io.StringWriter; importjava.util.ArrayList; importjava.util.List; importorg.xmlpull.v1.XmlPullParser; importorg.xmlpull.v1.XmlSerializer; importcom.example.ParserInterface.ScoreParser; importcom.example.ParserInterface.StudentInfo; importandroid.util.Xml; publicclassPullScoreParserimplementsScoreParser{ /** *XML文件解析,返回字符串形式的List *XmlPullParser.START_DOCUMENT:XML文件的入口 *XmlPullParser.START_TAG:一条数据的开始标志 *XmlPullParser.END_TAG:一条数据的结束标志 *XmlPullParser.END_DOCUMENT:XML文件的结束 */ publicList<StudentInfo>parseXML(InputStreamis)throwsException{ List<StudentInfo>list=null; StudentInfostu=null; XmlPullParserparser=Xml.newPullParser(); parser.setInput(is,"utf-8"); inteventType=parser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){//XML文件结尾 switch(eventType){ caseXmlPullParser.START_DOCUMENT: list=newArrayList<StudentInfo>(); break; caseXmlPullParser.START_TAG: if(parser.getName().equals("info")){ stu=newStudentInfo(); }elseif(parser.getName().equals("name")){ eventType=parser.next(); stu.setName(parser.getText().toString()); }elseif(parser.getName().equals("num")){ eventType=parser.next(); stu.setNum(parser.getText().toString()); }elseif(parser.getName().equals("score")){ eventType=parser.next(); stu.setScore(Double.parseDouble(parser.getText())); } break; caseXmlPullParser.END_TAG: if(parser.getName().equals("info")){ list.add(stu); stu=null; } break; default: break; } /** *之前少了下面一句,一直无法解开 */ eventType=parser.next(); } returnlist; } @Override publicStringserialize(List<StudentInfo>list)throwsException{ XmlSerializerserializer=Xml.newSerializer(); StringWriterwriter=newStringWriter(); serializer.setOutput(writer); serializer.startDocument("utf-8",true); serializer.startTag("","scores"); for(StudentInfostu:list){ serializer.startTag("","info"); serializer.startTag("","name"); serializer.text(stu.getName()); serializer.endTag("","name"); serializer.startTag("","num"); serializer.text(stu.getNum()); serializer.endTag("","num"); serializer.startTag("","score"); serializer.text(stu.getScore()+""); serializer.endTag("","score"); serializer.endTag("","info"); } serializer.endTag("","scores"); serializer.endDocument(); returnwriter.toString(); } } XMLTest.xml <?xmlversion="1.0"encoding="UTF-8"?> <scores> <info> <name>宋江</name> <num>10241</num> <score>80.0</score> </info> <info> <name>武松</name> <num>10242</num> <score>84.0</score> </info> <info> <name>卢俊义</name> <num>10243</num> <score>90.0</score> </info> <info> <name>李逵</name> <num>10244</num> <score>65</score> </info> </scores> <!--SD卡操作权限--> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |