Android XML解析與儲存程式碼

來源:互聯網
上載者:User

解析XML檔案:

在Android中,常見的XML解析器分別為SAX解析器、DOM解析器和PULL解析器,下面,我將一一向大家詳細介紹。

SAX解析器:

SAX(Simple API for XML)解析器是一種基於事件的解析器,它的核心是事件處理模式,主要是圍繞著事件來源以及事件處理器來工作的。當事件來源產生事件後,呼叫事件處理器相應的處理方法,一個事件就可以得到處理。在事件來源呼叫事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態資訊,這樣事件處理器才能夠根據提供的事件資訊來決定自己的行為。

SAX解析器的優點是解析速度快,佔用記憶體少。非常適合在Android行動裝置中使用。

DOM解析器:

DOM是基於樹形結構的的節點或資訊片段的集合,允許開發人員使用DOM API遍曆XML樹、檢索所需資料。分析該結構通常需要載入整個文檔和構造樹形結構,然後才可以檢索和更新節點資訊。

由於DOM在記憶體中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文檔,解析和載入整個文檔將會很耗資源。

PULL解析器:

在Android平台上可以使用SAX、DOM和Android附帶的pull解析器解析XML檔案;
pull解析器提供了各種事件,使用parser.next()方法進入下一個元素並觸發相應事件,pull解析器產生的事件是一個數字,可以通過switch對感興趣的事件進行處理;通過paser.nextText()方法可以擷取下一個Text類型的節點的值;


讀取XML

 代碼如下 複製代碼
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8");//為破解器添加要解析的XML資料
int event = pullParser.getEventType();//開始讀取,擷取事件傳回值
pullParser.getName();//擷取節點名稱
pullParser.getAttributeValue(0);//擷取第一個屬性的值
pullParser.nextText();//擷取標籤之後的節點的內容
event = pullParser.next();

//解析器遇到結束標籤不會自動向下解析,需要調用此方法進行繼續執行;

儲存檔案到XML

 代碼如下 複製代碼

public static void save(List<Person> persons, OutputStream outStream)
throws Exception, IllegalStateException, IOException {
XmlSerializer serializer = Xml.newSerializer();//擷取XML寫入資訊的序列化對象
serializer.setOutput(outStream, "UTF-8");//設定要寫入的OutputStream
serializer.startDocument("UTF-8", true);//設定文檔標籤

serializer.startTag(null, "persons");//設定開始標籤,第一個參數為namespace
for (Person person : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());

serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");

serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");

serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
outStream.flush();
outStream.close();
}

解析xml

 代碼如下 複製代碼

<?xml version="1.0" encoding="utf-8"?>
<books>
 <book>
  <id>1001</id>
  <name>Thinking In Java</name>
  <price>80.00</price>
 </book>
 <book>
  <id>1002</id>
  <name>Core Java</name>
  <price>90.00</price>
 </book>
 <book>
  <id>1003</id>
  <name>Hello, Andriod</name>
  <price>100.00</price>
 </book>
</books>

然後我們分別使用以上三種解析技術解析文檔,得到一個List<Book>的對象,先來看一下Book.java的代碼:

 代碼如下 複製代碼

package com.scott.xml.model;

public class Book {
 private int id;
 private String name;
 private float price;
 
 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 float getPrice() {
  return price;
 }

 public void setPrice(float price) {
  this.price = price;
 }

 @Override
 public String toString() {
  return "id:" + id + ", name:" + name + ", price:" + price;
 }
}

最後,我們還要把這個集合對象中的資料產生一個新的XML文檔,產生的XML結構跟原始文檔略有不同,是下面這種格式:

 代碼如下 複製代碼

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1001">
    <name>Thinking In Java</name>
    <price>80.0</price>
  </book>
  <book id="1002">
    <name>Core Java</name>
    <price>90.0</price>
  </book>
  <book id="1003">
    <name>Hello, Andriod</name>
    <price>100.0</price>
  </book>
</books>

接下來,就該介紹操作過程了,我們先為解析器定義一個BookParser介面,每種類型的解析器需要實現此介面。BookParser.java代碼如下:

 代碼如下 複製代碼

package com.scott.xml.parser;

import java.io.InputStream;
import java.util.List;

import com.scott.xml.model.Book;

public interface BookParser {
 /**
  * 解析輸入資料流 得到Book對象集合
  * @param is
  * @return
  * @throws Exception
  */
 public List<Book> parse(InputStream is) throws Exception;
 
 /**
  * 序列化Book對象集合 得到XML形式的字串
  * @param books
  * @return
  * @throws Exception
  */
 public String serialize(List<Book> books) throws Exception;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.