Android中的XML解析和生成

 使用SAX或者DOM或者pull解析XML文件:

     在Android平臺上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)Android附帶的pull解析器解析XML文件。 下面是本例子要解析的XML文件:

文件名稱:itcast.xml

<?xml version="1.0" encoding="UTF-8"?>

<persons>

<person id="22">

<name>張三</name>

<age>30</age>

</person>

<person id="20">

<name>李四</name>

<age>20</age>

</person>

</persons>

使用SAX讀取XML文件:

SAX是一個解析速度快並且佔用內存少的xml解析器,非常適合用於Android等移動設備。 SAX解析XML文件採用的是事件驅動,也就是說,它並不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法:

startDocument():當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。

endDocument():和上面的方法相對應,當文檔結束的時候,調用這個方法,可以在其中做一些善後的工作。 

startElement(String namespaceURI, String localName, String qName, Attributes atts) :當讀到一個開始標籤的時候,會觸發這個方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標籤名,qName是帶命名空間前綴的標籤名。通過atts可以得到所有的屬性名和相應的值。要注意的是SAX中一個重要的特點就是它的流式處理,當遇到一個標籤的時候,它並不會紀錄下以前所碰到的標籤,也就是說,在startElement()方法中,所有你所知道的信息,就是標籤的名字和屬性,至於標籤的嵌套結構,上層標籤的名字,是否有子元屬等等其它與結構相關的信息,都是不得而知的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM來得那麼方便。

endElement(String uri, String localName, String name):這個方法和上面的方法相對應,在遇到結束標籤的時候,調用這個方法。

characters(char[] ch, int start, int length) :這個方法用來處理在XML文件中讀到的內容,第一個參數爲文件的字符串內容,後面兩個參數是讀到的字符串在這個數組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內容。

使用SAX讀取XML文件:

只要爲SAX提供實現ContentHandler接口的類,那麼該類就可以得到通知事件(實際上就是SAX調用了該類中的回調方法)。因爲ContentHandler是一個接口,在使用的時候可能會有些不方便,因此,SAX還爲其制定了一個Helper類:DefaultHandler,它實現了ContentHandler接口,但是其所有的方法體都爲空,在實現的時候,你只需要繼承這個類,然後重寫相應的方法即可。使用SAX解析itcast.xml的代碼如下:

public static List<Person> readXML(InputStream inStream) {

   try {

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser saxParser = spf.newSAXParser(); //創建解析器

//設置解析器的相關特性,http://xml.org/sax/features/namespaces = true 表示開啓命名空間特性  

//saxParser.setProperty("http://xml.org/sax/features/namespaces",true);

XMLContentHandler handler = new XMLContentHandler();

saxParser.parse(inStream, handler);

inStream.close();

return handler.getPersons();

   } catch (Exception e) {

e.printStackTrace();

   }

  return null;

}
使用DOM讀取XML文件:

除了可以使用 SAX解析XML文件,我們還可以使用熟悉的DOM來解析XML文件。 DOM解析XML文件時,會將XML文件的所有內容以對象樹方式存放在內存中,然後允許使用DOM API遍歷XML樹、檢索所需的數據。使用DOM操作XML的代碼看起來比較直觀,並且,在某些方面比基於SAX的實現更加簡單。但是,因爲DOM需要將XML文件的所有內容以對象樹方式存放在內存中,所以內存的消耗比較大,特別對於運行Android的移動設備來說,因爲設備的資源比較寶貴,所以建議還是採用SAX來解析XML文件,當然,如果XML文件的內容比較小採用DOM是可行的。
使用Pull解析器讀取XML文件:

除了可以使用 SAXDOM解析XML文件,大家也可以使用Android內置的Pull解析器解析XML文件。 Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。事件將作爲數值代碼被髮送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值。
使用Pull解析器生成XML文件:

有些時候,我們需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內容,然後把內容寫入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,這裏推薦大家使用Pull解析器。

使用Pull解析器生成一個與itcast.xml文件內容相同的myitcast.xml文件,代碼如下(生成XML文件):

File xmlFile = new File("myitcast.xml");

FileOutputStream outStream = new FileOutputStream(xmlFile);

OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");

BufferedWriter writer = new BufferedWriter(outStreamWriter);

writeXML(persons, writer);

writer.flush();

writer.close();

如果只想得到生成的xml字符串內容,可以使用StringWriter

StringWriter writer = new StringWriter();

writeXML(persons, writer);

String content = writer.toString();

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