編輯:關於Android編程
因為有些時候,應用的數據是采用XML文件的格式存放的,所以我們需要知道怎麼從XML文件中讀取這些數據
在Android中可以通過SAX、DOM、pull解析XML文件。
在本篇博文中主要介紹采用Pull解析器解析和生成XML內容。
介紹:在Android已經集成了Pull解析器,所以無需添加任何的jar文件。在Android中本身用到的各種xml文件,其內部也是采用Pull解析器進行解析的。
首先,我們需要先建立一個Android Project項目,名稱為:xml。默認生成MainActivity.java,在cn.itcast.xml包下,這個java文件裡邊的內容是自動生成的。
然後,我們在src目錄下建立一個xml文件:person.xml:
可以看出來這個xml文件存了兩個person的信息。zhangsan 30lisi 25
接下來,我們需要建立一個javabean來反射這個xml文件,Person.java(注意這個bean中的屬性要和xml中的對應,不然不能正確解析):
package cn.itcast.domain; public class Person { private Integer id; private String name; private Integer age; @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }在這個java文件中我們定義了三個屬性:id、name、age,並生成了一個toString()的方法
在實體類建好之後,我們需要寫業務層的類了,PersonService.java:
package cn.itcast.service; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import cn.itcast.domain.*; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import android.util.Xml; public class PersonService { public static List這段代碼比較麻煩,我們接下來具體分析一下:getPersons(InputStream xml) throws Exception{ List persons = null; Person person = null; //得到解析器 /*這個方法和下邊功能相同,可以得到解析器:XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();*/ XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(xml,"UTF-8");//為Pull解析器設置要解析的XML數據 int event = pullParser.getEventType(); //產生第一個事件:start document while(event != XmlPullParser.END_DOCUMENT){ switch (event) { //對事件進行判斷 case XmlPullParser.START_DOCUMENT: persons = new ArrayList (); break; case XmlPullParser.START_TAG: if("person".equals(pullParser.getName())){ int id = new Integer(pullParser.getAttributeValue(0)); person = new Person(); person.setId(id); } if("name".equals(pullParser.getName())){ String name = pullParser.nextText(); person.setName(name); } if("age".equals(pullParser.getName())){ int age = new Integer(pullParser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if("person".equals(pullParser.getName())){ persons.add(person); person = null; } break; } event = pullParser.next(); } return persons; } }
XmlPullParser pullParser = Xml.newPullParser();這段代碼是為了得到一個Pull解析器,另外:XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();也可以得到Pull解析器。
pullParser.setInput(xml,"UTF-8");用來設置要解析的xml文件的編碼格式,這裡是“UTF-8”
因為Pull解析器是一個遍歷文檔的過程,所以要從這個start document事件開始,一直到結束。
int event = pullParser.getEventType();在這個時候,文檔被初始化,這裡會獲得文檔的start document,就是START_DOCUMENT事件。
然後,是一個while循環,限制條件是event != XmlPullParser.END_DOCUMENT,即當前遍歷的節點沒有達到結尾,就會執行while循環。
在while循環裡邊是一個switch()控制語句,用來控制當前選中的是哪個節點,裡邊有三個case:
case XmlPullParser.START_DOCUMENT:滿足START_DOCUMENT事件(就是xml文件的開頭)
case XmlPullParser.START_TAG:滿足START_TAG事件(就是xml元素節點的開頭:比如本篇中的
case XmlPullParser.END_TAG::滿足END_TAG事件(就是xml元素節點的結尾:比如本篇中的)
在第二個case中,我們做了三個判斷:
if("person".equals(pullParser.getName())):如果到達的是person元素節點,則把id賦給person
if("name".equals(pullParser.getName())):如果到達的是name元素節點,則把name賦給person
if("age".equals(pullParser.getName())):如果到達的是age元素節點,則把age賦給person
注意,在每一次switch()控制語句結束之後,會有一個event = pullParser.next(),這句話的意思是把Pull解析器指針指向下個節點。
以上,我們就把Pull解析器完成了,然後我們編寫一個測試類:
注意首先配置AndroidManfiest.xml引入測試的語法,這裡不多說了。
編寫PersonServiceTest.java,放在cn.itcast.test文件目錄下:
package cn.itcast.test; import java.io.InputStream; import java.util.List; import cn.itcast.domain.Person; import cn.itcast.service.PersonService; import android.test.AndroidTestCase; import android.util.Log; public class PersonServiceTest extends AndroidTestCase{ private static final String TAG = "PersonServiceTest"; public void testPersons() throws Exception{ //通過getClassLoader()方法得到src目錄下person.xml文件的輸入流 InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml"); List然後,我們在LogCat頁面中添加一個過濾器:persons = PersonService.getPersons(xml); for(Person person : persons){ Log.i(TAG, person.toString()); } } }
就可以在LogCat頁面打印出來persons了。
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPGgyPrb+oaKyydPDUHVsbL3izvbG98n6s8lYTUzE2sjdPC9oMj4KPHA+ztLDx9Kq1NpQZXJzb25TZXJ2aWNlLmphdmHW0Lao0uXSu7j2c2F2ZSgpt723qNPDwLTJ+rPJWE1MzsS8/qO6PC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">/**
* 保存數據
* @param persons 數據
* @param out 輸出方向
* @throws Exception
*/
public static void save(List
public void testSave() throws Exception{ List我們就可以在files文件目錄下生成一個itcast.xml文件了persons = new ArrayList (); persons.add(new Person(43, "zhangxx",80)); persons.add(new Person(24, "lisi",80)); persons.add(new Person(12, "wangwu",80)); //放在/files目錄下 File xmlFile = new File(getContext().getFilesDir(),"itcast.xml"); //打開輸出流 FileOutputStream outStream = new FileOutputStream(xmlFile); PersonService.save(persons , outStream); //調用save()方法生成xml文件 }
經過多番測試實踐,實現了popupwindow 彈出在指定控件的下方。代碼上有注釋,有需要注意的地方。popupwindow 有自已的布局,裡面控件的監聽實現都有。接下來
一、Android Studio配置SVNAndroid Studio關聯配置SVN很簡單,在Settings裡面,找到Version Control->Subve
一、前言今天我們開啟Android系統篇的文章了,其實一直想弄,只是之前一直沒有太多深入的了解,最近又把這塊拿出來好好看了一下,所以想從新梳理一下,來看看Android中
很多Android手機用戶都喜歡收集APK安裝包並保存在存儲卡內。可是,網上下載的APK大都以英文或亂碼命名,管理起來好不麻煩。那麼,無需借助PC,我們能否