Android中利用SAX解析XML文件(转)

1.什么是SAX

答:Android平台解析XML主要是使用SAX这么一个标准。日常开发中有两种常见方式解析XML,一种是SAX;另一种就是DOM(文档对象模型),把XML文档看做一棵树,有根节点,子节点和叶节点,首先要把XML文档全部装载在内存中,然后解析成一棵树,在树上进行相应的操作,好处就是操作简单方便,缺点就是当处理文档比较大,性能上就会存在一些问题。

 SAX是逐行的扫描文档,可一边扫描一边解析,可以在解析文档的任意时刻来停止这次解析。缺点是操作起来稍微复杂一些,通过SAX往XML文档中添加或删除内容比较费劲。

 

2.SAX基本原理

答:SAX(Simple API for XML),既是指一种接口,也是指一个软件包。

作为接口,SAX是事件驱动型XML解析的一个标准接口

SAX是一个标准,做出这个标准就是为了解析XML文档

 

SAX的工作原理简单的说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素(element)开始与结束,文档结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。(以事件为驱动的解析的过程)

 大多数SAX实现都会产生以下类型的事件:

    在文档的开始和结束时触发文档处理事件。

    在文档内每一个XML元素接受解析的前后触发元素事件。

    任何元数据通常都由单独的事件交付。

    在处理文档的DTD或Schema时产生DTD或Schema事件。

    产生错误事件用来通知主机应用程序解析错误。

 

          SAX模型

                    

 

解析文档过程

 对于如下文档:

 <doc>

  <para>Hello,world! </para>

</doc>

在解析文档的过程中会产生如下一系列事件

 start document                     (1)创建事件处理程序

start element:doc                  (2)创建SAX解析器

start element:para                 (3)将事件处理程序分配给解析器

characters: Hello,world!             (4)对文档进行解析,将每个事件发送给处理程序

end element:para

end element:doc

end document

 

   SAX常用接口

答: ContentHandler接口

  ContentHandler是java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束,元素的开头和结束,以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。

  ContentHandler接口的方法有以下几种:

    void  startDocument();    void  endDocument();

void  startElement(String uri,String localName,String qName,Attributes arrs);

void  endElement(String uri,String localName,String qName);

void  character(char[] ch,int start,int length);//得到标签之间的内容

其中,uri表示得到当前正在解析的标签的命名空间;localName是不带前缀的标签值,qName是带前缀的标签值;Attributes表示得到标签所有属性。

 

 

 注意:要非常小心这里的character方法。

                              

     在图中标明2的地方会调用characters(char[] ch, int start, int length)方法,不要以为那里是空白,Sax解析器可不那么认为,Sax解析器会把它认为是一个TextNode。但是这个空白不是我们想要的数据,我们是想要<name>节点下的文本信息。这就要定义一个记录当上一节点的名称的TAG,在characters(.....)方法中,判断当前节点是不是name

 

     XMLActivity.java

[java]  view plain copy
  1. package com.examples.xml;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.StringReader;  
  5.   
  6. import javax.xml.parsers.ParserConfigurationException;  
  7. import javax.xml.parsers.SAXParserFactory;  
  8.   
  9. import org.xml.sax.InputSource;  
  10. import org.xml.sax.SAXException;  
  11. import org.xml.sax.XMLReader;  
  12.   
  13. import com.examples.utils.HttpDownloader;  
  14.   
  15. import android.app.Activity;  
  16. import android.os.Bundle;  
  17. import android.view.View;  
  18. import android.view.View.OnClickListener;  
  19. import android.widget.Button;  
  20.   
  21. public class XMLActivity extends Activity {  
  22.     /** Called when the activity is first created. */  
  23.     private Button parseBtn;  
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.           
  29.         parseBtn =(Button)findViewById(R.id.parseBtn);  
  30.         parseBtn.setOnClickListener(new parseBtnListener());  
  31.     }  
  32.       
  33.     class  parseBtnListener implements OnClickListener  
  34.     {  
  35.         @Override  
  36.         public void onClick(View v) {  
  37.             HttpDownloader httpdown = new HttpDownloader();  
  38.             String result = httpdown.download("http://202.193.82.14:8080/vao1500/test.xml");  
  39.             System.out.println(result);  
  40.             //创建一个SAXParserFactory  
  41.             SAXParserFactory saxParser =  SAXParserFactory.newInstance();  
  42.             try {  
  43.                 XMLReader xmlReader=saxParser.newSAXParser().getXMLReader();  
  44.                 //为xmlReader设置内容处理器  
  45.                 xmlReader.setContentHandler(new MyContentHandler());  
  46.                 //开始解析文件  
  47.                 xmlReader.parse(new InputSource(new StringReader(result)));  
  48.                   
  49.             } catch (Exception e) {  
  50.                 e.printStackTrace();  
  51.             }  
  52.         }  
  53.     }  
  54. }  


    MyContentHandler.java

[java]  view plain copy
  1. package com.examples.xml;  
  2.   
  3. import org.xml.sax.Attributes;  
  4. import org.xml.sax.SAXException;  
  5. import org.xml.sax.helpers.DefaultHandler;  
  6.   
  7. public class MyContentHandler  extends DefaultHandler  
  8. {  
  9.     String sName,sSex,sAddress,sStatus,sMoney;  
  10.     String tagName;  
  11.     @Override  
  12.     public void startDocument() throws SAXException {  
  13.         System.out.println("start------------->");  
  14.     }  
  15.       
  16.     @Override  
  17.     public void endDocument() throws SAXException {  
  18.           
  19.          System.out.println("end------------->");  
  20.     }  
  21.       
  22.     @Override  
  23.     public void startElement(String uri, String localName, String qName,  
  24.             Attributes attributes) throws SAXException {  
  25.         tagName = localName;  
  26.         if(localName.equals("worker"))  
  27.         {  
  28.             //获得标签全部属性  
  29.             for(int i=0;i<attributes.getLength();i++)  
  30.             {  
  31.                  System.out.println(attributes.getLocalName(i) + " = "+ attributes.getValue(i));  
  32.             }  
  33.         }  
  34.     }  
  35.       
  36.     @Override  
  37.     public void endElement(String uri, String localName, String qName)  
  38.             throws SAXException {  
  39.         //在worker标签解析之后,会打印出所有得到的数据  
  40.         if(localName.equals("worker"))  
  41.         {  
  42.            this.printout();  
  43.         }  
  44.         tagName = null;  
  45.     }  
  46.       
  47.     @Override  
  48.     public void characters(char[] ch, int start, int length)  
  49.             throws SAXException {  
  50.         if(tagName !=null)  
  51.         {  
  52.             if(tagName.trim().equalsIgnoreCase("name"))  
  53.             {  
  54.                 sName = new String(ch,start, length);  
  55.             }else if(tagName.trim().equalsIgnoreCase("sex"))  
  56.             {  
  57.                 sSex = new String(ch,start, length);  
  58.             }else if(tagName.trim().equalsIgnoreCase("address"))  
  59.             {  
  60.                 sAddress = new String(ch,start, length);  
  61.             }else if(tagName.trim().equalsIgnoreCase("status"))  
  62.             {  
  63.                 sStatus = new String(ch,start, length);  
  64.             }  
  65.             else if(tagName.trim().equalsIgnoreCase("money"))  
  66.             {  
  67.                 sMoney = new String(ch,start, length);  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     public void printout()  
  73.     {  
  74.         System.out.print("name:");  
  75.         System.out.println(sName);  
  76.         System.out.print("sex:");  
  77.         System.out.println(sSex);  
  78.         System.out.print("address:");  
  79.         System.out.println(sAddress);  
  80.         System.out.print("status:");  
  81.         System.out.println(sStatus);  
  82.         System.out.print("money:");  
  83.         System.out.println(sMoney);  
  84.     } 
  85. }  

  86. 原作者:http://blog.csdn.net/xutaogenlanqiu/article/details/6612925
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值