Android中xml的讀寫
通常把數據封裝到對象中,然後通過對象倆操作數據。包名不能使用Android或Java的關鍵字。
當一個應用被刪除時,該應用在內部存儲空間內的所有數據都會被刪除,而應用在外部存儲空間的數據不會被刪除。備份文件一般都放在外部存儲空間中。
對於xml文件的校驗,可以把xml文件放到瀏覽器中去解析,如果能夠正常解析說明xml文件是正確的。
短信備份案例:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.test.backsms.MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="back"
android:text="備份短信" />
</RelativeLayout>
通過bean封裝對象
package com.test.backsms.domain;
public class MessageBean {
//短信的內容
private String body;
//短信接收日期
private String date;
//短信發送的目的地
private String address;
//短信的類型:接收或者是發送
private String type;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public MessageBean(String body, String date, String address, String type) {
super();
this.body = body;
this.date = date;
this.address = address;
this.type = type;
}
}
package com.test.backsms;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.test.backsms.domain.MessageBean;
public class MainActivity extends Activity {
List<MessageBean> smsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//模擬短信
//創建list對象存儲短信
smsList = new ArrayList<MessageBean>();//非常重要,不能忘記
for(int i=0;i<10;i++){
MessageBean mb = new MessageBean("adsfasf", i+"", "13985666565", "1");
System.out.println(mb.getAddress()+mb.getBody()+mb.getDate()+mb.getType());
smsList.add(mb);
}
}
//備份短信
public void back(View v) {
//現在內存中把數據格式拼接出來,然後再寫出去
//通過StringBuffer對象拼接
StringBuffer sb = new StringBuffer();
//添加xml聲明
sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
//添加根節點
sb.append("<message>");
//添加子節點
for (MessageBean sms :smsList) {
sb.append("<sms>");
//添加內容節點
sb.append("<body>");
sb.append(sms.getBody());
sb.append("</body>");
sb.append("<date>");
sb.append(sms.getDate());
sb.append("</date>");
sb.append("<address>");
sb.append(sms.getAddress());
sb.append("</address>");
sb.append("<type>");
sb.append(sms.getType());
sb.append("</type>");
sb.append("</sms>");
}
sb.append("</message>");
String path = "sdcard/sms.xml";
File file = new File(path);
try {
FileOutputStream fos = new FileOutputStream(file);
try {
fos.write(sb.toString().getBytes());
//關流
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
添加寫權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在Android中,提供了xml序列化器來生成xml文件。在Android中默認的編碼格式爲utf-8 。xml序列化器會過濾掉沒有用到的不完整的標籤
package com.test.backsms;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import com.test.backsms.domain.MessageBean;
public class MainActivity extends Activity {
List<MessageBean> smsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//模擬短信
//創建list對象存儲短信
smsList = new ArrayList<MessageBean>();//非常重要,不能忘記
for(int i=0;i<10;i++){
MessageBean mb = new MessageBean("adsfasf", i+"", "13985666565", "1");
System.out.println(mb.getAddress()+mb.getBody()+mb.getDate()+mb.getType());
smsList.add(mb);
}
}
//備份短信
public void back(View v) {
//使用序列化器生成xml對象
//1.拿到xml序列化對象
XmlSerializer xs = Xml.newSerializer();
//2.初始化 文件名和路徑
String path = "sdcard/sms.xml";
String encoding ="utf-8";
File file = new File(path);
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
try {
//指定用什麼編碼生成xml文件
xs.setOutput(fos, encoding);
//3.開始生成xml
//指定xml文件申明中encoding的值,true表示yes,文件獨立
xs.startDocument(encoding, true);
//生成文件的根節點xs.startTag(namespace, name);
xs.startTag(null, "message");
//生成xml文件的節點
for(MessageBean sms:smsList){
xs.startTag(null, "sms");
xs.startTag(null, "body");
xs.text(sms.getBody());
xs.endTag(null, "body");
xs.startTag(null, "date");
xs.text(sms.getDate());
xs.endTag(null, "date");
xs.startTag(null, "address");
xs.text(sms.getAddress());
xs.endTag(null, "address");
xs.startTag(null, "type");
xs.text(sms.getType());
xs.endTag(null, "type");
xs.endTag(null, "sms");
}
//關閉根節點
xs.endTag(null, "message");
//告訴序列化器xml文件生成結束。
xs.endDocument();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}