现在的位置: 首页 > 综合 > 正文

android之sax解析xml文件 android之sax解析xml文件

2017年12月12日 ⁄ 综合 ⁄ 共 6793字 ⁄ 字号 评论关闭
 

android之sax解析xml文件

分类: android_数据增删查改 2256人阅读 评论(5) 收藏 举报

 

beauties.xml

[xhtml] view
plain
copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beauties>  
  3.     <beauty>  
  4.         <name>林志玲</name>  
  5.         <age>28</age>  
  6.     </beauty>  
  7.     <beauty>  
  8.         <name>杨幂</name>  
  9.         <age>23</age>  
  10.     </beauty>  
  11.   
  12. </beauties>  

main.xml

 

[xhtml] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView    
  8.     android:id="@+id/textView"  
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="wrap_content"   
  11.     />  
  12. </LinearLayout>  

activity的代码:

[java] view
plain
copy

  1. package cn.com.saxtest;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5.   
  6. import javax.xml.parsers.SAXParser;  
  7. import javax.xml.parsers.SAXParserFactory;  
  8.   
  9. import org.xml.sax.Attributes;  
  10. import org.xml.sax.SAXException;  
  11. import org.xml.sax.helpers.DefaultHandler;  
  12.   
  13. import android.app.Activity;  
  14. import android.os.Bundle;  
  15. import android.util.Log;  
  16. import android.widget.TextView;  
  17.   
  18. /** 
  19.  *  
  20.  * @author chenzheng_java 
  21.  * @description 使用sax解析方式解析xml 
  22.  * @since 2010/03/04 
  23.  *  
  24.  */  
  25. public class SaxParserActivity extends Activity {  
  26.   
  27.     private ArrayList<Beauty> beautyList = new ArrayList<Beauty>();  
  28.     private Beauty beauty = null;  
  29.   
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.   
  35.         SAXParserFactory factory = SAXParserFactory.newInstance();  
  36.         try {  
  37.             SAXParser parser = factory.newSAXParser();  
  38.             InputStream inputStream = this.getClassLoader()  
  39.                     .getResourceAsStream("beauties.xml");  
  40.             parser.parse(inputStream, new MyDefaultHandler());  
  41.               
  42.             String result = "";  
  43.             for(Beauty beauty:beautyList){  
  44.                 result+="/n "+beauty.toString();  
  45.             }  
  46.               
  47.             TextView textView = (TextView) findViewById(R.id.textView);  
  48.             textView.setText(result);  
  49.               
  50.               
  51.   
  52.         } catch (Exception e) {  
  53.             e.printStackTrace();  
  54.         }  
  55.   
  56.     }  
  57.   
  58.     /** 
  59.      *  
  60.      * @author chenzheng_java 
  61.      * @description 一定要注意,这里是使用的内部类哦。 有些朋友可能有疑问,不用内部类不可以,答案是:当然可以。 
  62.      *              这里用内部类的目的其实就是为了提高一丁点效率而已。 如果你喜欢看源码,你就会发现,源码中大量的使用了内部类的。 
  63.      *  
  64.      */  
  65.     private class MyDefaultHandler extends DefaultHandler {  
  66.   
  67.         // 存储目前为止读取到的最后一个element的localname  
  68.         private String currentElementName = "";  
  69.   
  70.         /** 
  71.          * characters (char ch[], int start, int length)当解析xml中遇到文本内容时会执行。 ch 
  72.          * 这个数组中存放的是整个xml文件的字符串的数组形式 start是当前解析的文本在整个xml字符串文件中的开始位置 
  73.          * length是当前解析的文本内容的长度 由上面的介绍我们可以知道,我们可以通过new 
  74.          * String(ch,start,length)方法来获取我们正解析的文本内容 
  75.          */  
  76.         @Override  
  77.         public void characters(char[] ch, int start, int length)  
  78.                 throws SAXException {  
  79.             Log.i("currentElementName", currentElementName);  
  80.             String textContent = new String(ch, start, length);  
  81.               
  82.             if(currentElementName.equals("name")&&textContent!=null&&!textContent.trim().equals("")){  
  83.                 Log.i("textContent name", textContent);  
  84.                 beauty.setName(textContent);  
  85.                   
  86.             }  
  87.             if(currentElementName.equals("age")&&textContent!=null&&!textContent.trim().equals("")){  
  88.                 Log.i("textContent age", textContent);  
  89.                 beauty.setAge(textContent);  
  90.             }  
  91.   
  92.         }  
  93.   
  94.         /** 
  95.          *解析到xml文档的末尾时触发 
  96.          */  
  97.         @Override  
  98.         public void endDocument() throws SAXException {  
  99.         }  
  100.   
  101.         /** 
  102.          * 解析到元素的末尾时触发 
  103.          */  
  104.         @Override  
  105.         public void endElement(String uri, String localName, String qName)  
  106.                 throws SAXException {  
  107.             if(localName.equals("beauty")){  
  108.                 beautyList.add(beauty);  
  109.                 Log.i("beauty", beauty.toString());  
  110.                   
  111.             }  
  112.         }  
  113.   
  114.         /** 
  115.          * 开始解析xml时触发 
  116.          */  
  117.         @Override  
  118.         public void startDocument() throws SAXException {  
  119.               
  120.         }  
  121.   
  122.         /** 
  123.          * 解析到元素的开始处触发 startElement (String uri, String localName, String qName, 
  124.          * Attributes attributes) uri:Namespace值,当用户没有明确指定以及当命名空间没有被使用的时候,为null 
  125.          * localName:element的名称,或者通俗点叫标签的名称。如<name>中的name就是localName qName: 
  126.          * 和localName的唯一其别是 
  127.          * ,当标签有namespace时,该值返回的数据为全限定名称。例如<chen:name>中,localName为name 
  128.          * ,qName为chen:name attributes:元素包含的属性对象。如果没有属性时,返回一个空的属性对象 
  129.          */  
  130.         @Override  
  131.         public void startElement(String uri, String localName, String qName,  
  132.                 Attributes attributes) throws SAXException {  
  133.             currentElementName = localName;  
  134.             if(localName.equals("beauty")){  
  135.                 beauty = new Beauty();  
  136.             }  
  137.               
  138.         }  
  139.   
  140.     }  
  141.   
  142.     /** 
  143.      *  
  144.      * @author chenzheng 这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间 
  145.      *  
  146.      */  
  147.     private class Beauty {  
  148.         String name;  
  149.         String age;  
  150.   
  151.         public String getName() {  
  152.             return name;  
  153.         }  
  154.   
  155.         public void setName(String name) {  
  156.             this.name = name;  
  157.         }  
  158.   
  159.         public String getAge() {  
  160.             return age;  
  161.         }  
  162.   
  163.         public void setAge(String age) {  
  164.             this.age = age;  
  165.         }  
  166.   
  167.         @Override  
  168.         public String toString() {  
  169.             return "美女资料 [年龄=" + getAge() + ", 姓名=" + getName() + "]";  
  170.         }  
  171.   
  172.     }  
  173.   
  174. }  

 

运行后就会得到想要的结果了、

 

代码结构:

 

----------------------------------------------------------------------------------------------------------

下面,再让我们一起讨论点废话:

 

 

 

 

SAX 解析
1. SAX ( Simple Application interface for XML ), 是一组程序设计接口,采用 observer 模式,将XML文件视为一个文字流的数据,在读取XML 元素时触发一系列的事件。这是观察者模式的一个典型应用。

2. 使用SAX 加载XML文件时,他的操作像打开一个“顺序的文件字符流”,在读到XML元素的开始标记,结尾标记和内容标记时将产生一系列的事件
如一个简单的XML文件:<hello><message>hello XML!</message></hello>
会相应的触发:startDocument, startElement, characters, endElement, endDocument, 只需编写这些事件处理程序就可以解析XML文件了

3. SAX 可以高效的使用内存,因为SAX 只是顺序的读取XML 文件的内容,并不会将XML 文件完全加载,这样就比DOM 的处理效率高
但SAX 只能读取XML 文件的内容,而不能更改XML 的内容,也不能随机访问XML 元素 

4. 在SAX 中有4个处理器是要实现的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以处理不同的事件,这是比较麻烦的,
幸好SAX 定义了一个 DefaultHandler 类把这几个实现了,我们只需在 DefaultHandler中定义事件处理方法,然后注册到XMLReader,而SAXParser封装了XMLReader的实现类,
SAXParser又是由SAXParserFactory提供的,所以我们实际用到的类只有:SAXParserFactory,SAXParser,DefaultHandler

5. SAX 的解析步骤:
(1)写一个类继承 DefaultHandler, 实现自己的事件处理方法
(2)在主程序中建立 SAXParserFactory
(3)可以设置这个factory 的参数
(4)从这个factory 得到SAXParser
(5)解析XML文件

抱歉!评论已关闭.