一、生成xml文件(XmlSerializer方法)
与StringBuffer方式不同:
按钮点击事件改为:
public void click(View v){
try {
XmlSerializer serializer = Xml.newSerializer();
File file = new
File(Environment.getExternalStorageDirectory().getPath(),"Smsdata.xml");
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos,"utf-8");
serializer.startDocument("utf-8",true);
serializer.startTag(null,"smss");
for (Sms sms : smsList){
serializer.startTag(null,"sms");
serializer.startTag(null,"address");
serializer.text(sms.getAddress());
serializer.endTag(null,"address");
serializer.startTag(null,"body");
serializer.text(sms.getBody());
serializer.endTag(null,"body");
serializer.startTag(null,"date");
serializer.text(sms.getDate());
serializer.endTag(null,"date");
serializer.endTag(null,"sms");
}
serializer.endTag(null,"smss");
serializer.endDocument();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
二、解析xml文件(XmlPullParser)(模拟天气信息)
1.根据xml文件定义java实体类,包含属性,getter()、setter(),toString()显示方法
2.定义一个java类,功能是来解析xml
3.获取XmlPullParser解析实例
XmlPullParser parser = Xml.newPullParser();
4.设置XmlPullParser的参数
parser.setInput(in,"utf-8");
5.获取事件类型,不停的解析,在解析xml的类中定义方法
public static List<Channel> parseXml(InputStream in) throws Exception{
LIst<Channel> weatherLists = null; //定义一个集合
Channel channel = null; //定义一个实体对象
int type = parser.getEventType();
while(type!=XmlPullParser.END_DOCLMENT){ //不到结尾一直循环
switch(type){
case XmlPullParser.START_TAG: //开始标签
//开始具体判断是解析到了哪个节点
if("weather".equals(parser.getName())){ //如果是weather的开始标签
weatherLists = new ArrayList<Channel>(); //创建一个集合对象
}else if("channel".equals(parser.getName())){ //如果是channel开始标签
channel = new Channel(); //创建Channel对象
String id = parse.getAttributeValue(0); //取出文件中id值,“0”含义为取第一位
channel.setId(id); //取出的id传给Channel对象
}else if("city".equals(parser.getName())){ //如果是city开始标签
String city = parser.nextText(); //取出city数据
channel.setCity(city); //取出的city值传给Channel对象
}else if("temp".equals(parser.getName())){
String temp= parser.nextText();
channel.setTemp(temp);
}else if("wind".equals(parser.getName())){
String wind= parser.nextText(); //同上取出temp、wind、pm250值
channel.setWind(wind);
}else if("pm250".equals(parser.getName())){
String pm250= parser.nextText();
channel.setPm250(pm250);
}
break;
case XmlPullParser.END_TAG: //结束标签
if("channel".equals(parser.getName())){ //如果结束标签为channel
weatherLists.add(channel); //将Channel对象放入集合中
}
break;
}
type = parser.next(); //下一个事件类型给type
}
return weatherLists; //返回集合
}
6.在MainActivity中调用所定义的解析方法
try{
findViewById(R.id.tv_weather); //(1)定义TextView控件,并找到控件
//(2)调用我们定义的解析xml方法
List<Channel> weatherlists = WeatherParser.parserXml(inputStream);
StringBuffer sb = new StringBuffer(); //(3)组拼数据
for(Channel channel : weatherlists){
sb.append(channel.toString());
}
tv_weather.setText(sb.toString()); //(4)将数据展示到控件上
}catch(Exception e){
e.printStackTrace();
}
扫描二维码关注公众号,回复:
2416122 查看本文章