Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android_XML文件解析

Android_XML文件解析

編輯:關於Android編程

      在android開發中,經常用到去解析xml文件,常見的解析xml的方式有一下三種:SAX、Pull、Dom解析方式,今天學習了Android—XML文件解析三種方法中的一種較常用的SAX,它不能向文件中添加內容。

 這種方式解析是一種基於事件驅動的api,有兩個部分,解析器和事件處理器,解析器就是XMLReader接口,負責讀取XML文檔,和向事件處理器發送事件(也是事件源),事件處理器ContentHandler接口,負責對發送的事件響應和進行XML文檔處理。

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方法進行解析。

代碼:


[java]  import java.io.IOException; 
import java.io.InputStream; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class Xml extends Activity { 
    private Button button; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_xml); 
        button=(Button)findViewById(R.id.button); 
        button.setOnClickListener(new buttonClickListener()); 
    } 
    class buttonClickListener implements OnClickListener 
    { 
 
        /* (non-Javadoc)
         * @see android.view.View.OnClickListener#onClick(android.view.View)
         */      
        @Override 
        public void onClick(View v) { 
            // TODO Auto-generated method stub  
            new Thread() 
            { 
                public void run() 
                { 
                    InputStream inputStream = null; 
                    try {//得到本軟件上的文件  
                        inputStream = getResources().getAssets().open("test.xml"); 
                    } catch (IOException e1) { 
                        e1.printStackTrace(); 
                    } 
                     
                    try { 
                        //獲得SAXParser對象的工廠實例  
                        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); 
                        //獲得XMLReader示例  
                        XMLReader reader=saxParserFactory.newSAXParser().getXMLReader(); 
                        //注冊處理XML文檔內容解析事件的ContentHandler  
                        reader.setContentHandler(new MyContentHandler()); 
                        //開始解析string對象中所包含的XML資源  
                        reader.parse(new InputSource(inputStream)); 
                    } catch (SAXException e) { 
                        // TODO Auto-generated catch block  
                        e.printStackTrace(); 
                    } catch (ParserConfigurationException e) { 
                        // TODO Auto-generated catch block  
                        e.printStackTrace(); 
                    } catch (IOException e) { 
                        // TODO Auto-generated catch block  
                        e.printStackTrace(); 
                    }    
                } 
            }.start();               
        } 
         
    } 

import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Xml extends Activity {
 private Button button;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xml);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new buttonClickListener());
    }
    class buttonClickListener implements OnClickListener
    {

  /* (non-Javadoc)
   * @see android.view.View.OnClickListener#onClick(android.view.View)
   */  
  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   new Thread()
   {
    public void run()
    {
     InputStream inputStream = null;
     try {//得到本軟件上的文件
      inputStream = getResources().getAssets().open("test.xml");
     } catch (IOException e1) {
      e1.printStackTrace();
     }
     
     try {
      //獲得SAXParser對象的工廠實例
      SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
      //獲得XMLReader示例
      XMLReader reader=saxParserFactory.newSAXParser().getXMLReader();
      //注冊處理XML文檔內容解析事件的ContentHandler
      reader.setContentHandler(new MyContentHandler());
      //開始解析string對象中所包含的XML資源
      reader.parse(new InputSource(inputStream));
     } catch (SAXException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (ParserConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } 
    }
   }.start();    
  }
     
    }
}

[java]  import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
 
public class MyContentHandler extends DefaultHandler 

    private String name,sex,address,money,status,tagName; 
    /* (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#startDocument()
     */ 
    @Override 
    public void startDocument() throws SAXException { 
        // TODO Auto-generated method stub  
        System.out.println("--------開始解析--------"); 
    } 
 
    /* (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
     */ 
    //遇到新的標簽即新的元素時執行  
    @Override 
    public void startElement(String uri, String localName, String qName, 
            Attributes attributes) throws SAXException { 
        /*注:uri:命名空間
         * localName:得到無前綴便簽
         * qName:得到有前綴標簽
         * attributes:得到標簽的屬性*/      
        tagName=localName;//以tagName的值來判斷正在解析哪個標簽         
        if(localName.equals("worker")) 
        {//依次獲取標簽的全部屬性  
            for(int i=0;i<attributes.getLength();i++) 
                System.out.println(attributes.getLocalName(i)+"="+attributes.getValue(i));               
        } 
    } 
 
    /* (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
     */ 
    @Override 
    public void characters(char[] ch, int start, int length) 
            throws SAXException { 
        // TODO Auto-generated method stub    
        if(tagName.equals("name"))       
            name=new String(ch,start,length); 
        else if(tagName.equals("sex")) 
            sex=new String(ch,start,length); 
        else if(tagName.equals("status")) 
            status=new String(ch,start,length); 
        else if(tagName.equals("address"))       
            address=new String(ch,start,length); 
        else if(tagName.equals("money")) 
            money=new String(ch,start,length); 
             
    } 
 
    /* (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
     */ 
    //標簽解析完成之後執行  
    @Override 
    public void endElement(String uri, String localName, String qName) 
            throws SAXException { 
        // TODO Auto-generated method stub    
        tagName="";//清除tagName原來的值,這樣在遇到空白節點時可以通過tagName識別出處理的是空白節點  
        if(localName.equals("worker")) 
        {//打印出所有得到的數據  
            System.out.print("name:"+name); 
            System.out.print("  sex:"+sex); 
            System.out.print("  status:"+status); 
            System.out.print("  address:"+address); 
            System.out.println("  money:"+money); 
        } 
    } 
 
    /* (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#endDocument()
     */ 
    @Override 
    public void endDocument() throws SAXException { 
        // TODO Auto-generated method stub  
        System.out.println("--------解析結束--------"); 
    } 
 

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyContentHandler extends DefaultHandler
{
    private String name,sex,address,money,status,tagName;
 /* (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#startDocument()
  */
 @Override
 public void startDocument() throws SAXException {
  // TODO Auto-generated method stub
  System.out.println("--------開始解析--------");
 }

 /* (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
  */
 //遇到新的標簽即新的元素時執行
 @Override
 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  /*注:uri:命名空間
   * localName:得到無前綴便簽
   * qName:得到有前綴標簽
   * attributes:得到標簽的屬性*/  
  tagName=localName;//以tagName的值來判斷正在解析哪個標簽  
  if(localName.equals("worker"))
  {//依次獲取標簽的全部屬性
   for(int i=0;i<attributes.getLength();i++)
    System.out.println(attributes.getLocalName(i)+"="+attributes.getValue(i));    
  }
 }

 /* (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
  */
 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  // TODO Auto-generated method stub 
  if(tagName.equals("name"))  
   name=new String(ch,start,length);
  else if(tagName.equals("sex"))
   sex=new String(ch,start,length);
  else if(tagName.equals("status"))
   status=new String(ch,start,length);
  else if(tagName.equals("address"))  
   address=new String(ch,start,length);
  else if(tagName.equals("money"))
   money=new String(ch,start,length);
   
 }

 /* (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
  */
 //標簽解析完成之後執行
 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  // TODO Auto-generated method stub 
  tagName="";//清除tagName原來的值,這樣在遇到空白節點時可以通過tagName識別出處理的是空白節點
  if(localName.equals("worker"))
  {//打印出所有得到的數據
   System.out.print("name:"+name);
   System.out.print("  sex:"+sex);
   System.out.print("  status:"+status);
   System.out.print("  address:"+address);
   System.out.println("  money:"+money);
  }
 }

 /* (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#endDocument()
  */
 @Override
 public void endDocument() throws SAXException {
  // TODO Auto-generated method stub
  System.out.println("--------解析結束--------");
 }

}


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved