歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android SAX解析 XML方式

Android SAX解析 XML方式

日期:2017/3/1 10:45:10   编辑:Linux編程

下面說明第一種解析sax解析方式:

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來得那麼方便。

本文源碼下載見 http://www.linuxidc.com/Linux/2011-12/50319.htm

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

characters(char[] ch, int start, int length)

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

xml的源文件和android dom 解析xml方式中的xml 文件內容相同,可以參照那個文件來解析(見 http://www.linuxidc.com/Linux/2011-12/50318.htm ),只是名稱不同而已,

這個途中圖中有三個saxTest.xml文件,分別對應三種不同的讀取方式
  1. <pre name="code" class="html"> // 讀取類得包下的xml文件
  2. // InputStream inputStream =
  3. // this.getClass().getClassLoader().getResourceAsStream("cn/com/sax/saxTest.xml");
  4. //讀取src下xml文件
  5. InputStream inputStream =
  6. this.getClass().getClassLoader().getResourceAsStream("saxTest.xml");
  7. // 讀取assets下的xml文件
  8. // InputStream inputStream = this.getAssets().open("saxTest.xml");
第一種方式解析xml 主要是繼承DefaultHandler,實現其中的幾個方法 

下面放出我解析的源碼:


  1. /**
  2. * 用sax解析xml的第一種方式
  3. * @return
  4. */
  5. private String saxParse(){
  6. SAXParserFactory factory = SAXParserFactory.newInstance();
  7. SAXParser parser;
  8. String xmlStr = "第一種解析方式:\n";
  9. try {
  10. // 讀取類得包下的xml文件
  11. // InputStream inputStream =
  12. // this.getClass().getClassLoader().getResourceAsStream("cn/com/sax/saxTest.xml");
  13. //讀取src下xml文件
  14. InputStream inputStream =
  15. this.getClass().getClassLoader().getResourceAsStream("saxTest.xml");
  16. // 讀取assets下的xml文件
  17. // InputStream inputStream = this.getAssets().open("saxTest.xml");
  18. parser = factory.newSAXParser();
  19. SaxParseHandler personHandler = new SaxParseHandler();
  20. parser.parse(inputStream, personHandler);
  21. xmlStrxmlStr = xmlStr + personHandler.parseToString();
  22. } catch (ParserConfigurationException e) {
  23. e.printStackTrace();
  24. Log.e("TEST", "" + e.toString());
  25. } catch (SAXException e) {
  26. e.printStackTrace();
  27. Log.e("TEST", "" + e.toString());
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. Log.e("TEST", "" + e.toString());
  31. }
  32. return xmlStr;
  33. }
繼承DefaultHandler處理xml中的元素節點。
  1. class SaxParseHandler extends DefaultHandler {
  2. String result;
  3. public String parseToString() {
  4. return result;
  5. }
  6. String str = null;
  7. /**
  8. * xml開始時,執行此函數
  9. */
  10. @Override
  11. public void startDocument() throws SAXException {
  12. // Log.e("TEST", "startDocument");
  13. }
  14. /**
  15. * xml結束時,執行此函數
  16. */
  17. @Override
  18. public void endDocument() throws SAXException {
  19. // Log.e("TEST", "endDocument");
  20. }
  21. /**
  22. * xml標簽開始時,執行此函數,讀取標簽名稱,和標簽內的屬性
  23. */
  24. @Override
  25. public void startElement(String uri, String localName, String qName,
  26. Attributes attributes) throws SAXException {
  27. if ("group".equals(localName)) {
  28. String groupName = attributes.getValue(0);
  29. String num = attributes.getValue(1);
  30. resultresult = result + "groupName=" + groupName + " num =" + num
  31. + "\n";
  32. } else if ("person".equals(localName)) {
  33. String personName = attributes.getValue(0);
  34. String age = attributes.getValue(1);
  35. // 和getValue(1)等效
  36. // String txt = attributes.getValue("age");
  37. resultresult = result + "personName" + personName + " age=" + age
  38. + "\n";
  39. } else {
  40. str = localName;
  41. }
  42. // Log.e("TEST", "startElement");
  43. }
  44. /**
  45. * xml標簽結束時,執行此函數
  46. */
  47. @Override
  48. public void endElement(String uri, String localName, String qName)
  49. throws SAXException {
  50. str = null;
  51. // Log.e("TEST", "endElement");
  52. }
  53. /**
  54. * 解析標簽內的值,如<chinese>ssss</chinese>,為了讀取"ssss"
  55. */
  56. @Override
  57. public void characters(char[] ch, int start, int length)
  58. throws SAXException {
  59. if (str != null) {
  60. String data = new String(ch, start, length);
  61. //xml文件格式化的時候容易產生以下換行,制表符等特殊字符,
  62. //這些需要特別注意處理
  63. Pattern p = Pattern.compile("\\s*|\t|\r|\n");
  64. Matcher m = p.matcher(data);
  65. data = m.replaceAll("");
  66. if ("chinese".equals(str)) {
  67. if(!data.equals("")){
  68. String chinese = data;
  69. resultresult = result + "chinese=" + chinese;
  70. }
  71. } else if ("english".equals(str)) {
  72. if(!data.equals("")){
  73. String english = data;
  74. resultresult = result + "english=" + english + "\n";
  75. }
  76. }
  77. }
  78. }
  79. }
Copyright © Linux教程網 All Rights Reserved