編輯:關於Android編程
Java 中是可以用 SAX 和 DOM 解析 XML 的,雖然在 Android 下也可以用這2中方式,但是還是推薦用 Pull。Pull 使用簡單,效率相對高,Android 下是集成了 Pull ,所以並不需要用到第三方的包。
下面來舉例子,我要向 XML 文檔中讀寫學生信息,首先我定義一個學生類,包含ID、學號、姓名和年齡
public class Student {
public Student() {};
public Student(int id, int number, String name, int age) {
this.id = id;
this.number = number;
this.name = name;
this.age = age;
}
private int id;
private int number;
private String name;
private int age;
public int getId() {
return id;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setId(int id) {
this.id = id;
}
public void setNumber(int number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + ", age=" + age
+ "]";
}
}33 張三 2029 李四 19
然後我寫了個 XmlHelper 類,有個靜態方法 getStudes,該方法接受輸入流,返回學生信息的集合
public static ListgetStudents(InputStream xml) throws Exception { List students = null; Student student = null; XmlPullParser parser = Xml.newPullParser(); //得到 Pull 解析器 parser.setInput(xml, "UTF-8"); //設置輸入,編碼為 UTF-8 int event = parser.getEventType(); //得到事件類型,每讀取到一個位置都有相對的事件類型 while (XmlPullParser.END_DOCUMENT != event) { //沒到文檔結尾就要循環讀取 switch (event) { case XmlPullParser.START_DOCUMENT: //這是文檔開始事件,我們在這個地方做一些初始化工作 students = new ArrayList (); break; case XmlPullParser.START_TAG: //標簽開始事件,標簽開始就是上面XML中的 、 、 時說明一個學生的信息已經讀取完了 if (parser.getName().equals("student")) { students.add(student); student = null; } break; default: break; } event = parser.next(); //一個讀取完了,就下一個,如此循環 } return students; }、 、和 if (parser.getName().equals("student")) { //讀取到這個 student 標簽就說明下面就是我需要的信息了 int id = Integer.valueOf(parser.getAttributeValue(0)); student = new Student(); student.setId(id); } if (null != student) { //避免出現空指針,先判斷一下再繼續 if (parser.getName().equals("number")) { int number = Integer.valueOf(parser.nextText()); // nextText() 就是得到標簽後面的文本 student.setNumber(number); }else if (parser.getName().equals("name")) { String name = parser.nextText(); student.setName(name); }else if (parser.getName().equals("age")) { int age = Integer.valueOf(parser.nextText()); student.setAge(age); } } break; case XmlPullParser.END_TAG: //讀取到
public static void generate(Liststudents, OutputStream os) throws Exception { XmlSerializer serializer = Xml.newSerializer(); //得到序列化器 serializer.setOutput(os, "UTF-8"); //設置輸出 serializer.startDocument("UTF-8", true); //文檔開始了 serializer.startTag(null, "students"); //標簽開始了 for (Student student : students) { serializer.startTag(null, "student"); //子標簽開始了 serializer.attribute(null, "id", String.valueOf(student.getId())); //指定該標簽屬性,這裡是ID //下面3個就是生成學號、姓名和年齡 serializer.startTag(null, "number"); serializer.text(String.valueOf(student.getNumber())); serializer.endTag(null, "number"); serializer.startTag(null, "name"); serializer.text(student.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(String.valueOf(student.getAge())); serializer.endTag(null, "age"); serializer.endTag(null, "student"); //子標簽結束 } serializer.endTag(null, "students"); //標簽結束 serializer.endDocument(); //文檔結束 os.flush(); //如果傳入的輸出流不是文件,就就要刷新一下緩沖區 os.close(); } }
public class XmlHelperTest extends AndroidTestCase {
private static final String TAG = "XmlHelperTest";
public void testGetStudents() throws Exception {
InputStream xmlIstm = this.getClass().getClassLoader().getResourceAsStream("students.xml");
List students = XmlHelper.getStudents(xmlIstm);
for (Student student : students) {
Log.i(TAG, student.toString());
}
}
public void testGenerate() throws Exception {
List students = new ArrayList();
students.add(new Student(1, 13, "小建", 21));
students.add(new Student(2, 16, "大康", 20));
File xmlFile = new File(getContext().getFilesDir(), "students.xml");
FileOutputStream fos = new FileOutputStream(xmlFile);
try {
XmlHelper.generate(students, fos);
Log.i(TAG, "生成XML文件成功");
} catch(Exception e) {
Log.i(TAG, "生成XML文件失敗:" + e.getMessage());
}
}
}
Android性能優化-SQLite數據庫
本系列博文我想圍繞在Android中的一些優化細節和大家進行分享。Android中的優化可謂又是一重任,Android不足以像PC端具有很高的內存執行空間給我們用來重量級
百度定位與車聯網API實現天氣預報
百度定位的環境配置1. 獲取密鑰通過開放平台進行應用注冊獲取百度提供的appkey值,這個值用於進行定位時的認證。選擇android端app勾選所有權限進行app的注冊。
開源 android 文件管理器
我寫一個開源的安卓文件器。源代碼在github:源代碼 # File_Explorer# Android 文件管理器包常用ui控件有:1.側滑菜單sliding
Android ViewPager使用詳解
這是谷歌官方給我們提供的一個兼容低版本安卓設備的軟件包,裡面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我們可以做很多事情,從最簡