大家晚上好,今天給大家講解的是pull解析與生成xml檔案,這主要有兩個效果,其一,将完整格式的xml解析,在listView清單顯示,這個知識點就要運用上幾講關于擴充卡知識點來做,其二,自己定義标準格式的xml檔案,生成并發放在内部儲存中。
由于這次的代碼比較多,我主要講解關鍵的代碼,其他布局什麼的,就不講,有不懂可以是底下問我。
1.PullActivity.java
private ListView bookList;
private List<Map<String, Object>> data;
private Context context;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull);
bookList = (ListView) findViewById(R.id.list);
context = this;
try {
//用輸入流擷取asset下的xml檔案
InputStream is = getAssets().open("book.xml");
//調用業務層方法,方法的結果存在List的data值裡
data = fileManager.parse(is);
//建立簡單型擴充卡,參數一:上下文,參數二:要存的資料 參數三:layout布局 ,參數四:從哪裡來,key值 ,參數五:到哪裡去,布局對應的Id
SimpleAdapter adapter = new SimpleAdapter(this, data,
R.layout.item_list, new String[] { "name", "price" },
new int[] { R.id.name_et, R.id.price_et });
//設定擴充卡,展示資料
bookList.setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
}
}
public void export(View v) {
try {
//擷取導入的路徑,getFilesDir()
File rootPath = context.getFilesDir();
//建立檔案,參數一:路徑 ,參數二:xml命名
File file = new File(rootPath, "new2.xml");
//輸出流寫入資料
FileOutputStream fos = new FileOutputStream(file);
Toast.makeText(context, "導入成功", Toast.LENGTH_SHORT).show();
//調用業務層的方法,傳的參數是,data,fos,
fileManager.export(data, fos);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.fileManager.java 業務層,主要書寫方法
//定義聲明
private static final String BOOK = "book";
private static final String BOOKS = "books";
private static final String NAME = "name";
private static final String ID = "id";
private static final String PRICE = "price";
public static List<Map<String, Object>> parse(InputStream is)
throws Exception {
List<Map<String, Object>> data = null;
HashMap<String, Object> map = null;
//建立解析器
XmlPullParser parser = Xml.newPullParser();
//設定編碼方式
parser.setInput(is, "utf-8");
//擷取xml類型
int eventType = parser.getEventType();
//當條件滿足時,開始執行循環
while (eventType != XmlPullParser.END_DOCUMENT) {
//switch case 判斷
switch (eventType) {
//開始文檔
case XmlPullParser.START_DOCUMENT:
//初始化儲存的清單
data = new ArrayList<Map<String, Object>>();
break;
//開始标簽
case XmlPullParser.START_TAG:
//得到開始标簽下的屬性值
String name = parser.getName();
//逐一開始判斷,
//屬性值的BOOK時
if (name.equals(BOOK)) {
map = new HashMap<String, Object>();
//得到id值
String id = parser.getAttributeValue(0);
map.put(ID, Integer.valueOf(id));
//屬性值Name時
} else if (name.equals(NAME)) {
map.put(NAME, parser.nextText());
//屬性值為PRICE時
} else if (name.equals(PRICE)) {
map.put(PRICE, parser.nextText());
}
break;
//結束标簽
case XmlPullParser.END_TAG:
if (parser.getName().equals(BOOK)) {
//添加到清單中
data.add(map);
}
break;
default:
break;
}
//最關鍵的地方,每次都要在往下執行一次
eventType = parser.next();
}
傳回已有資料的data值
return data;
}
public static void export(List<Map<String, Object>> data,
FileOutputStream fos) throws Exception {
//建立序号器,它有個特點,有了開始,必定有結束
XmlSerializer serializer = Xml.newSerializer();
//輸出流的格式
serializer.setOutput(fos, "utf-8");
//開始文檔
serializer.startDocument("utf-8", true);
//開始标簽,開始的标簽的命名為BOOKS
serializer.startTag(null, BOOKS);
//用map集合進行data周遊
for (Map map : data) {
//下一個開始标簽BOOK
serializer.startTag(null, BOOK);
//設定屬性ID,用map得到id的實際值
serializer.attribute(null, ID, map.get(ID).toString());
//下一個開始标簽,NAME
serializer.startTag(null, NAME);
//設定文本值
serializer.text(map.get(NAME).toString());
serializer.endTag(null, NAME);
//設定下一個開始标簽PRICE
serializer.startTag(null, PRICE);
//設定PRICE值
serializer.text(map.get(PRICE).toString());
//結束标簽
serializer.endTag(null, PRICE);
serializer.endTag(null, BOOK);
}
//結束标簽有頭也有尾
serializer.endDocument();
serializer.endTag(null, BOOKS);
//關閉輸出流
fos.close();
}
pull解析與生成就到這裡,為什麼要詳細講解這個解析呢,因為在我們做開發的時候,解析與生成xml最常用的方法就是pull,大家好好看看這篇部落格,相信能給大家以後開發項目有用。時間過得很快,淩晨十二點多了,該洗洗睡,熬夜傷身,養好身體才有精力敲代碼。晚安。