天天看點

android面試題總結02 在android中本地寫入一個xml檔案

上次去面試一家做framework層的公司,問到了很多java基礎,還有怎麼在android本地用java寫一個xml。

然後想了半天想起來看黑馬視訊裡學過XmlSerializer這個xml序列化工具,然後我就回答有個XML序列化工具,然後裡面有setTag方法(這個其實應該是startTag)

反正就是回答的很不清楚,然後面試官說可以了解,畢竟這個不常用,我知道你知道,用過就行了,就這樣過了。後來回來查了一下源碼,具體在android中寫一個

xml檔案代碼如下:

XmlSerializer serializer = Xml.newSerializer();		// 建立Xmlserializer的對象
		// 指定序列化對象輸出的流
		FileOutputStream fos = new FileOutputStream("/mnt/sdcard/person.xml");
		serializer.setOutput(fos, "utf-8");
		
		serializer.startDocument("utf-8", true);	// 寫xml頭
		
		serializer.startTag(null, "persons");	// 開始的根節點
		
		for (Person person : personList) {
			serializer.startTag(null, "person");
			serializer.attribute(null, "id", String.valueOf(person.getId()));
			
			// 寫人的姓名
			serializer.startTag(null, "name");
			serializer.text(person.getName());
			serializer.endTag(null, "name");
			
			// 寫人的年齡
			serializer.startTag(null, "age");
			serializer.text(String.valueOf(person.getAge()));
			serializer.endTag(null, "age");
			
			serializer.endTag(null, "person");
           

另外解析剛才的xml檔案

// 建立Pull解析器對象
		XmlPullParser parser = Xml.newPullParser();
		// 指定解析的檔案
		FileInputStream fis = new FileInputStream("/mnt/sdcard/person.xml");
		parser.setInput(fis, "UTF-8");
		
		int eventType = parser.getEventType();		// 獲得解析器的第一個事件類型 
		
		List<Person> personList = null;
		Person person = null;
		String name;
		
		while(eventType != XmlPullParser.END_DOCUMENT) {		// 如果事件類型不等于結束的類型, 繼續循環
			String tagName = parser.getName();		// 獲得目前節點的名稱

			// 解析資料
			switch (eventType) {
			case XmlPullParser.START_TAG:		// 代表開始節點 <persons>
				
				if("persons".equals(tagName)) {
					// 初始化集合
					personList = new ArrayList<Person>();
				} else if("person".equals(tagName)) {
					person = new Person();
					person.setId(Integer.valueOf(parser.getAttributeValue(null, "id")));
				} else if("name".equals(tagName)) {
					name = parser.nextText();		// 目前是<name> 節點 nextText是取<name> 後邊的值
					person.setName(name);
				} else if("age".equals(tagName)) {
					person.setAge(Integer.parseInt(parser.nextText()));
				}
				break;
			case XmlPullParser.END_TAG:		// 代表結束節點 </person>
				if("person".equals(tagName)) {		// 目前是</person>
					// 把上面person的對象添加到集合中
					personList.add(person);
				}
				break;
			default:
				break;
			}
			
			eventType = parser.next();		// 指派下一個事件類型
		}