1.Xml的两种生成方式:
第一种:
使用StringBuffer sb=new StringBuffer();
//创建sb 对象
StringBuffer sb=new StringBuffer();
//组拼xml的文件头
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
//组拼xms根节点
sb.append("<smss>");
//组拼sms节点
for (Sms sms:smslist){
sb.append("<sms>");
sb.append("<address>");
sb.append(sms.getAddress());
sb.append("</address>");
sb.append("<bodyu>");
sb.append(sms.getBodyu());
sb.append("</bodyu>");
sb.append("<date>");
sb.append(sms.getDate());
sb.append("</date>");
sb.append("</sms>");
}
sb.append("</smss>");
try {
File file=new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml");
FileOutputStream fos=new FileOutputStream(file);
fos.write(sb.toString().getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
第二种:
使用XmlSerializer
try {
//[1]获取 XmlSerializer 类的实例,通过工具类Xml的 Xml.newSerializer()方法
XmlSerializer serializer= Xml.newSerializer();
//[2]设置XmlSerializer的序列化参数。
File file=new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup22.xml" );
FileOutputStream fos=new FileOutputStream(file);
//指定fos流的编码方式
serializer.setOutput(fos,"utf-8");
//[3]开始写Xml文件的开头 第一个参数为文件的编码方式第二个参数是否为独立文件(没有其他约束)
serializer.startDocument("utf-8",true);
//写xml的根节点 第一个参数为命名空间 不需要写null,第二个节点名称
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,"bodyu");
serializer.text(sms.getBodyu());
serializer.endTag(null,"bodyu");
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 (IOException e) {
e.printStackTrace();
}
2.Xml的解析
第一步:编写解析Xml的业务方法
//服务器以流的形式返回数据所以 传入参数为一个流
public static List<Sms> parserXml(InputStream in) throws Exception{
//[0]声明集合对象
List<Sms> weatherlists=null;
Sms sms=null;
//[1]获取XmlPullParser 解析实例 通过工具类Xml的Xml.newPullParser()方法
XmlPullParser parser= Xml.newPullParser();
//[2]设置XmlPullParser 的参数 第一个为一个流 第二个为编码方式
parser.setInput(in,"utf-8");
//[3]获取事件类型 不等于结尾继续向下解析
int type=parser.getEventType();
while (type!=XmlPullParser.END_DOCUMENT){
switch (type){
case XmlPullParser.START_TAG://解析开始标签
//具体判断 是哪个开始标签
if("smss".equals(parser.getName())){
weatherlists=new ArrayList<Sms>();
}else if("sms".equals(parser.getName())){
//取出这个标签的属性 0代表取第一个
//parser.getAttributeValue(0);
sms=new Sms();
}else if("address".equals(parser.getName())){
//取出两个标签中的数据
String adderss=parser.nextText();
sms.setAddress(adderss);
}else if("bodyu".equals(parser.getName())){
String bodyu=parser.nextText();
sms.setBodyu(bodyu);
}else if("date".equals(parser.getName())){
String date=parser.nextText();
sms.setDate(date);
}
break;
case XmlPullParser.END_TAG://解析结束标签
if("sms".equals(parser.getName())){
//把数据 存入集合
weatherlists.add(sms);
}
break;
}
//不停向下解析 直到结束
type=parser.next();
}
return weatherlists;
}
第二步:在MainActivity中调用 已经编写好的业务方法
//[1]显示Xml信息
TextView tv_weather=findViewById(R.id.tv_weather);
//[1.2] 获取资产的管理者 通过上下文
try {
InputStream is=getAssets().open("weather.xml");
//调用定义好的 业务方法
List<Sms> list=Weatherparser.parserXml(is);
StringBuffer sb=new StringBuffer();
for (Sms sms:list){
sb.append(sms.toString());
}
//把数据显示在 TextView 上
tv_weather.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}