android之sax解析xml檔案

來源:互聯網
上載者:User

 

beauties.xml

<?xml version="1.0" encoding="UTF-8"?><br /><beauties><br /><beauty><br /><name>林志玲</name><br /><age>28</age><br /></beauty><br /><beauty><br /><name>楊冪</name><br /><age>23</age><br /></beauty></p><p></beauties><br />

main.xml

 

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><TextView<br />android:id="@+id/textView"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> /><br /></LinearLayout><br />

activity的代碼:

package cn.com.saxtest;</p><p>import java.io.InputStream;<br />import java.util.ArrayList;</p><p>import javax.xml.parsers.SAXParser;<br />import javax.xml.parsers.SAXParserFactory;</p><p>import org.xml.sax.Attributes;<br />import org.xml.sax.SAXException;<br />import org.xml.sax.helpers.DefaultHandler;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.widget.TextView;</p><p>/**<br /> *<br /> * @author chenzheng_java<br /> * @description 使用sax解析方式解析xml<br /> * @since 2010/03/04<br /> *<br /> */<br />public class SaxParserActivity extends Activity {</p><p>private ArrayList<Beauty> beautyList = new ArrayList<Beauty>();<br />private Beauty beauty = null;</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);</p><p>SAXParserFactory factory = SAXParserFactory.newInstance();<br />try {<br />SAXParser parser = factory.newSAXParser();<br />InputStream inputStream = this.getClassLoader()<br />.getResourceAsStream("beauties.xml");<br />parser.parse(inputStream, new MyDefaultHandler());</p><p>String result = "";<br />for(Beauty beauty:beautyList){<br />result+="/n "+beauty.toString();<br />}</p><p>TextView textView = (TextView) findViewById(R.id.textView);<br />textView.setText(result);</p><p>} catch (Exception e) {<br />e.printStackTrace();<br />}</p><p>}</p><p>/**<br /> *<br /> * @author chenzheng_java<br /> * @description 一定要注意,這裡是使用的內部類哦。 有些朋友可能有疑問,不用內部類不可以,答案是:當然可以。<br /> * 這裡用內部類的目的其實就是為了提高一丁點效率而已。 如果你喜歡看源碼,你就會發現,源碼中大量的使用了內部類的。<br /> *<br /> */<br />private class MyDefaultHandler extends DefaultHandler {</p><p>// 儲存目前為止讀取到的最後一個element的localname<br />private String currentElementName = "";</p><p>/**<br /> * characters (char ch[], int start, int length)當解析xml中遇到常值內容時會執行。 ch<br /> * 這個數組中存放的是整個xml檔案的字串的數組形式 start是當前解析的文本在整個xml字串檔案中的開始位置<br /> * length是當前解析的常值內容的長度 由上面的介紹我們可以知道,我們可以通過new<br /> * String(ch,start,length)方法來擷取我們正解析的常值內容<br /> */<br />@Override<br />public void characters(char[] ch, int start, int length)<br />throws SAXException {<br />Log.i("currentElementName", currentElementName);<br />String textContent = new String(ch, start, length);</p><p>if(currentElementName.equals("name")&&textContent!=null&&!textContent.trim().equals("")){<br />Log.i("textContent name", textContent);<br />beauty.setName(textContent);</p><p>}<br />if(currentElementName.equals("age")&&textContent!=null&&!textContent.trim().equals("")){<br />Log.i("textContent age", textContent);<br />beauty.setAge(textContent);<br />}</p><p>}</p><p>/**<br /> *解析到xml文檔的末尾時觸發<br /> */<br />@Override<br />public void endDocument() throws SAXException {<br />}</p><p>/**<br /> * 解析到元素的末尾時觸發<br /> */<br />@Override<br />public void endElement(String uri, String localName, String qName)<br />throws SAXException {<br />if(localName.equals("beauty")){<br />beautyList.add(beauty);<br />Log.i("beauty", beauty.toString());</p><p>}<br />}</p><p>/**<br /> * 開始解析xml時觸發<br /> */<br />@Override<br />public void startDocument() throws SAXException {</p><p>}</p><p>/**<br /> * 解析到元素的開始處觸發 startElement (String uri, String localName, String qName,<br /> * Attributes attributes) uri:Namespace值,當使用者沒有明確指定以及當命名空間沒有被使用的時候,為null<br /> * localName:element的名稱,或者通俗點叫標籤的名稱。如<name>中的name就是localName qName:<br /> * 和localName的唯一其別是<br /> * ,當標籤有namespace時,該值返回的資料為全限定名稱。例如<chen:name>中,localName為name<br /> * ,qName為chen:name attributes:元素包含的屬性對象。如果沒有屬性時,返回一個空的屬性對象<br /> */<br />@Override<br />public void startElement(String uri, String localName, String qName,<br />Attributes attributes) throws SAXException {<br />currentElementName = localName;<br />if(localName.equals("beauty")){<br />beauty = new Beauty();<br />}</p><p>}</p><p>}</p><p>/**<br /> *<br /> * @author chenzheng 這裡使用內部類是為了效率考慮,內部類要比單獨頂一個bean類更加的高效以及節約空間<br /> *<br /> */<br />private class Beauty {<br />String name;<br />String age;</p><p>public String getName() {<br />return name;<br />}</p><p>public void setName(String name) {<br />this.name = name;<br />}</p><p>public String getAge() {<br />return age;<br />}</p><p>public void setAge(String age) {<br />this.age = age;<br />}</p><p>@Override<br />public String toString() {<br />return "美女資料 [年齡=" + getAge() + ", 姓名=" + getName() + "]";<br />}</p><p>}</p><p>}

 

運行後就會得到想要的結果了、

 

代碼結構:

 

----------------------------------------------------------------------------------------------------------

下面,再讓我們一起討論點廢話:

 

 

 

 

SAX 解析 1. SAX ( Simple Application interface for XML ), 是一組程式設計介面,採用 observer 模式,將XML檔案視為一個文字流的資料,在讀取XML 元素時觸發一系列的事件。這是觀察者模式的一個典型應用。

2. 使用SAX 載入XML檔案時,他的操作像開啟一個“順序的檔案字元流”,在讀到XML元素的開始標記,結尾標記和內容標記時將產生一系列的事件
如一個簡單的XML檔案:<hello><message>hello XML!</message></hello>
會相應的觸發:startDocument, startElement, characters, endElement, endDocument, 只需編寫這些事件處理常式就可以解析XML檔案了

3. SAX 可以高效的使用記憶體,因為SAX 只是順序的讀取XML 檔案的內容,並不會將XML 檔案完全載入,這樣就比DOM 的處理效率高
但SAX 只能讀取XML 檔案的內容,而不能更改XML 的內容,也不能隨機訪問XML 元素

4. 在SAX 中有4個處理器是要實現的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以處理不同的事件,這是比較麻煩的,
幸好SAX 定義了一個 DefaultHandler 類把這幾個實現了,我們只需在 DefaultHandler中定義事件處理方法,然後註冊到XMLReader,而SAXParser封裝了XMLReader的實作類別,
SAXParser又是由SAXParserFactory提供的,所以我們實際用到的類只有:SAXParserFactory,SAXParser,DefaultHandler

5. SAX 的解析步驟:
(1)寫一個類繼承 DefaultHandler, 實現自己的事件處理方法
(2)在主程式中建立 SAXParserFactory
(3)可以設定這個factory 的參數
(4)從這個factory 得到SAXParser
(5)解析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.