XML文件和JSON文件的解析及生成

      在Android中最常見的兩種數據格式就是XML和JSON,這方面也有很多好的解析框架,如果有興趣不可網上找找。當然對於一個開發者而言,不僅僅是隻會使用這些框架,而應該還要了解基本實現原理。今天主要是來講講XML文件和JSON文件的解析及生成。

XML(可擴展標記語言)的序列化與解析

XML的序列化:

  1. 使用XML類的newSerializer()靜態方法得到一個XmlSerializer對象。
  2. 接着使用XmlSerializer對象的setOutput()爲XmlSerializer對象設置一個輸出流。
  3. 然後就可以使用具體的startDocument開始文檔,endDocument結束文檔,startTag開始元素,endTag結束元素,attribute設置元素屬性,text添加文本等方法來創建具體的XML文檔內容。

XML文件的三中解析:

Pull解析: 在android系統中,很多資源文件中,很多都是xml格式,在android系統中解析這些xml的方式,是使用pul解析器進行解析的,它和sax解析一樣(個人感覺要比sax簡單點),也是採用事件驅動進行解析的,當pull解析器,開始解析之後,我們可以調用它的getEventType()方法,來獲取下一個解析事件(就是開始文檔,結束文檔,開始標籤,結束標籤),當處於某個元素時可以調用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值,通過next()方法下移指針。
      XmlPullParser對象的獲取:使用XML類的newPullParser()靜態方法得到一個XmlPullParser對象,接着使用XmlPullParser對象的setInput()爲XmlPullParser對象設置一個輸入流
XmlPullParser類常用的方法與靜態字段

方法或靜態字段 說明
setInput(InputStream inputStream,String inputEncoding) 設置輸入流及編碼格式
setInput(InputStream inputStream,String inputEncoding) 設置輸入流及編碼格式
getEventType() 得到當前指針所在位置的解析事件
XmlPullParser.END_DOCUMENT 結束文檔解析事件
XmlPullParser.START_DOCUMENT 開始文檔解析事件
XmlPullParser.START_TAG 開始標籤解析事件
XmlPullParser.END_TAG 結束標籤解析事件
nextText() 獲取本節點的值
getAttributte() 本節點屬性的值
parser.next() 指針下移

SAX解析:這種方式解析是一種基於事件驅動的api,有兩個部分,解析器和事件處理器,解析器就是XMLReader接口,負責讀取XML文檔,和向事件處理器發送事件(也是事件源),事件處理器ContentHandler接口,負責對發送的事件響應和進行XML文檔處理。SAX是事件驅動型XML解析的一個標準接口,不會改變SAX的工作原理,簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束
下面是ContentHandler接口的常用方法
      public abstract void characters (char[] ch, int start, int length)
      這個方法來接收字符塊通知,解析器通過這個方法來報告字符數據塊,解析器爲了提高解析效率把讀到的所有字符串放到一個字符數組(ch)中,作爲參數傳遞給character的方法中,如果想獲取本次事件中讀取到的字符數據,需要使用start和length屬性。
      public abstract void startDocument () 接收文檔開始的通知
      public abstract void endDocument () 接收文檔結束的通知
      public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文檔開始的標籤
      public abstract void endElement (String uri, String localName, String qName) 接收文檔結束的標籤
      在一般使用中爲了簡化開發,在org.xml.sax.helpers提供了一個DefaultHandler類,它實現了ContentHandler的方法,我們只想繼承DefaultHandler方法即可。
      另外SAX解析器提供了一個工廠類:SAXParserFactory,SAX的解析類爲SAXParser 可以調用它的parser方法進行解析。

步驟:

  1. 實例化一個工廠SAXParserFactory
  2. 實例化SAXPraser對象,創建XMLReader 解析器
  3. 實例化handler,處理器
  4. 解析器註冊一個事件
  5. 讀取文件流
  6. 解析文件

DOM解析:將XML文件看成一DOM棵樹,它是將整個XML文檔載入內存(所以效率較低,不推薦使用),每一個節點當做一個對象
步驟:

  1. 調用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工廠類實例。
  2. 調用解析器工廠實例類的 newDocumentBuilder() 方法得到 DOM 解析器對象
  3. 調用 DOM 解析器對象的 parse() 方法解析 XML 文檔得到代表整個文檔的 Document 對象。

JSON文件的解析及生成

JSONArray類(org.json.JSONArray)和JSONObject類:

方法 說明
JSONArray() 無參構造方法
JSONArray(String JSONString) 有參構造方法,參數爲JSON字符串
Object get(int index) 根據下標得到相應的對象
JSONArray getJSONArray(int index) 根據下標得到JSON數組
JJSONObject getJSONObject(int index) 根據下標得到JSON對象
String getString(int index) 根據下標得到String對象
xx getxx(int index) 根據下標得到xx對象,xx代表一種數據類型
JSONArray put(int index, xx value) 向JSONArray對象添加數據,xx代表一種數據類型
JSONArray put( xx value) 向JSONArray對象添加數據,xx代表一種數據類型
boolean isNull(String name) 根據名字段判斷該字段是否爲空

對於輸入流爲JSON數據:
先將輸入轉化爲字節數組,再將字節數組轉化爲JSONArray或JSONObject對象,再通過get方法得到相應的數據。
將數據轉化爲JSON數據輸出:
先將數據轉化爲JSONArray或JSONObject對象,再將對象以輸出流的方法輸出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章