歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android SAX解析 XML方式

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