加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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"/>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读