截了图居然添加不了,不知是不是51的bug呀!!!在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。其实以上描述,就是对整个解析步骤的一个描述,看看代码吧package com.example.testxml;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.util.List;import com.example.ParserInterface.StudentInfo;import com.example.XMLParser.PullScoreParser;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.app.Activity;public class MainActivity extends Activity implements OnClickListener{private Listlist;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((Button) findViewById(R.id.button1)).setOnClickListener(this);((Button) findViewById(R.id.button2)).setOnClickListener(this);}private void readXML(){try {InputStream is = getAssets().open("XMLTest.xml");PullScoreParser psp = new PullScoreParser();list = psp.parseXML(is);StringBuffer sb = new StringBuffer();for(StudentInfo stu:list){Log.v("result", stu.toString());sb.append(stu.toString() + "\n");}((TextView)findViewById(R.id.textView1)).setText(sb);} catch (Exception e) {e.printStackTrace();}}private boolean serivalXML(){try {File file = new File(Environment.getExternalStorageDirectory(), "XMLTest.xml");//根目录下FileOutputStream fos = new FileOutputStream(file.getAbsoluteFile(), false);PullScoreParser psp = new PullScoreParser();String buf = psp.serialize(list);fos.write(buf.getBytes());fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();return false;}return true;}@Overridepublic void onClick(View arg0) {if(arg0.getId() == R.id.button1){readXML();}else if(arg0.getId() == R.id.button2){if(serivalXML()){((TextView)findViewById(R.id.textView1)).setText("已生成xml文件,保存在SD卡根目录下");}else{((TextView)findViewById(R.id.textView1)).setText("xml文件生成失败");}}}}
package com.example.ParserInterface;import java.io.InputStream;import java.util.List;public interface ScoreParser {/** *解析输入流 */public ListparseXML(InputStream is) throws Exception;/** * 序列化StudentInfo对象集合 * 得到XML形式的字符串 */public String serialize(List list) throws Exception;}package com.example.ParserInterface;public class StudentInfo { private String name; private String num; private double score; public StudentInfo(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public String toString(){ return "name: " + name + "num: " + num + "score: " + score; }}
package com.example.XMLParser;import java.io.InputStream;import java.io.StringWriter;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import com.example.ParserInterface.ScoreParser;import com.example.ParserInterface.StudentInfo;import android.util.Xml;public class PullScoreParser implements ScoreParser{/** * XML文件解析,返回字符串形式的List * XmlPullParser.START_DOCUMENT:XML文件的入口 * XmlPullParser.START_TAG:一条数据的开始标志 * XmlPullParser.END_TAG:一条数据的结束标志 * XmlPullParser.END_DOCUMENT:XML文件的结束 */public ListparseXML(InputStream is) throws Exception {List list = null;StudentInfo stu = null;XmlPullParser parser = Xml.newPullParser();parser.setInput(is, "utf-8");int eventType = parser.getEventType();while(eventType != XmlPullParser.END_DOCUMENT){//XML文件结尾switch(eventType){case XmlPullParser.START_DOCUMENT:list = new ArrayList ();break;case XmlPullParser.START_TAG:if(parser.getName().equals("info")){stu = new StudentInfo();}else if(parser.getName().equals("name")){eventType = parser.next();stu.setName(parser.getText().toString());}else if(parser.getName().equals("num")){eventType = parser.next();stu.setNum(parser.getText().toString());}else if(parser.getName().equals("score")){eventType = parser.next();stu.setScore(Double.parseDouble(parser.getText()));}break;case XmlPullParser.END_TAG:if(parser.getName().equals("info")){list.add(stu);stu = null;}break;default:break;}/** * 之前少了下面一句,一直无法解开 */eventType = parser.next();}return list;}@Overridepublic String serialize(List list) throws Exception {XmlSerializer serializer = Xml.newSerializer();StringWriter writer = new StringWriter();serializer.setOutput(writer);serializer.startDocument("utf-8", true);serializer.startTag("", "scores");for(StudentInfo stu : 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();return writer.toString();}}
XMLTest.xml
宋江 10241 80.0 武松 10242 84.0 卢俊义 10243 90.0 李逵 10244 65