android中pull解析xml檔案,androidpull解析xml

來源:互聯網
上載者:User

android中pull解析xml檔案,androidpull解析xml

在android系統中,很多資源檔中,很多都是xml格式,在android系統中解析這些xml的方式,是使用pul解析器進行解析的,它和sax解析一樣(個人感覺要比sax簡單點),也是採用事件驅動進行解析的,當pull解析器,開始解析之後,我們可以調用它的next()方法,來擷取下一個解析事件(就是開始文檔,結束文檔,開始標籤,結束標籤),當處於某個元素時可以調用XmlPullParser的getAttributte()方法來擷取屬性的值,也可調用它的nextText()擷取本節點的值。

以下是我們想要把對象進行序列化,得到如下格式的xml檔案,命名為person.xml:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><persons>    <person id="0">    <name>wang0</name>    <age>18</age>    </person>    <person id="1">        <name>wang1</name>        <age>19</age>    </person>    <person id="2">        <name>wang2</name>        <age>20</age>     </person>    <person id="3">        <name>wang3</name>        <age>21</age>     </person> </persons>
有些時候,我們需要產生一個XML檔案,產生XML檔案的方法有很多,如:可以只使用一個StringBuilder組拼XML內容,然後把內容寫入到檔案中;或者使用DOM API產生XML檔案,或者也可以使用pull解析器產生XML檔案,這裡推薦大家使用Pull解析器。我們定義一個類Person類,用來表示xml檔案中對應內容:

public class Person {private int id;private String name;private int age;@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}public Person(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}public Person() {super();// TODO Auto-generated constructor stub}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
下面我們使用Pull解析器產生XML檔案:
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);writeXmlToLocal();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}private List<Person> getPersonList() {List<Person> personList = new ArrayList<Person>();for (int i = 0; i < 4; i++) {personList.add(new Person(i, "wang" + i, 18 + i));}return personList;}/** * 寫xml檔案到本地 */private void writeXmlToLocal() {List<Person> personList = getPersonList();// 獲得序列化對象XmlSerializer serializer = Xml.newSerializer();try {//File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");File path = new File("/data/data/com.founder.xmldemo/", "persons.xml");FileOutputStream fos = new FileOutputStream(path);// 指定序列化對象輸出的位置和編碼serializer.setOutput(fos, "utf-8");serializer.startDocument("utf-8", true);// 寫開始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>serializer.startTag(null, "persons");// <persons>for (Person person : personList) {// 開始寫人serializer.startTag(null, "person");// <person>serializer.attribute(null, "id", String.valueOf(person.getId()));// 寫名字serializer.startTag(null, "name");// <name>serializer.text(person.getName());serializer.endTag(null, "name");// </name>// 寫年齡serializer.startTag(null, "age");// <age>serializer.text(String.valueOf(person.getAge()));serializer.endTag(null, "age");// </age>serializer.endTag(null, "person");// </person>}serializer.endTag(null, "persons");// </persons>serializer.endDocument();// 結束} catch (Exception e) {e.printStackTrace();}}}
運行程式,這樣我們就可以在/data/data/com.founder.xmldemo/目錄下找到儲存的xml檔案。

接下來我們可以使用pull解析剛剛產生的XML檔案,寫下如下代碼:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);List<Person> personList = parserXmlFromLocal();for (Person person : personList) {Log.i("TestCase", person.toString());}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}/** * 對sd卡中的xml檔案進行pull解析 * @return */private List<Person> parserXmlFromLocal() {try {File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");FileInputStream fis = new FileInputStream(path);// 獲得pull解析器對象XmlPullParser parser = Xml.newPullParser();// 指定解析的檔案和編碼格式parser.setInput(fis, "utf-8");int eventType = parser.getEventType(); // 獲得事件類型List<Person> personList = null;Person person = null;String id;while(eventType != XmlPullParser.END_DOCUMENT) {String tagName = parser.getName();// 獲得當前節點的名稱switch (eventType) {case XmlPullParser.START_TAG: // 當前等於開始節點  <person>if("persons".equals(tagName)) {// <persons>personList = new ArrayList<Person>();} else if("person".equals(tagName)) { // <person id="1">person = new Person();id = parser.getAttributeValue(null, "id");person.setId(Integer.valueOf(id));} else if("name".equals(tagName)) { // <name>person.setName(parser.nextText());} else if("age".equals(tagName)) { // <age>person.setAge(Integer.parseInt(parser.nextText()));}break;case XmlPullParser.END_TAG:// </persons>if("person".equals(tagName)) {// 需要把上面設定好值的person對象添加到集合中personList.add(person);}break;default:break;}eventType = parser.next();// 獲得下一個事件類型}return personList;} catch (Exception e) {e.printStackTrace();}return null;}}


通過以上方法我們就可以把xml檔案解析出來了

是不是很簡單呢



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.