| 
 | 
 
| 
 
 XML文件解析  
XML:可扩展标记语言。  
有DOM和SAX两种解析方式,下面介绍SAX解析方式  
SAX:  
一、什么是SAX  
全称:Simple API for XML,既是指一种接口,又是指一个软件包。  
作为接口,SAX是事件驱动型XML解析的一个标准接口。  
它是一个标准,用来解析XML文档。基于这项标准有各种各样的实现方法,有C++版本d 实现、java版本的实现。  
优点:  
1、逐行扫描文档,一边扫描一边解析  
2、可以在解析文档的任意时刻来停止解析  
缺点:  
1、操作复杂  
2、添加或删除内容比较麻烦  
二、SAX基本原理  
SAX的工作原理简单地说是对文档的顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。  
大多数SAX实现都会产生以下类型的事件:  
a)、在文档的开始和结束时触发文档处理事件。  
b)、在文档内每一XML元素接受解析的前后触发元素事件  
c)、任何元数据通常都由单独的事件交付  
d)、在处理文档的DTD或Schema时产生DTD或Schema事件  
e)、产生错误事件用来通知主机应用程序解析错误  
 
   
 
 
   
 
 
 
三、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 atts)        当开始读取一个元素(标签)时调用         
void endElement(String uri,String localName,String qName)        当读取完一个元素时调用         
void characters(char ch[],int start,int length)        当读取标签中间的内容时调用         
 
二、SAX解析示例  
示例1:解析一个从网上下载下来的.xml文件,并在控制台输出解析出来的内容。  
布局文件:  
Xml代码 
<?xml version="1.0" encoding="utf-8"?> 
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    android rientation="vertical" 
 
    android:layout_width="fill_parent" 
 
    android:layout_height="fill_parent" 
 
    > 
 
<TextView   
 
    android:layout_width="fill_parent"  
 
    android:layout_height="wrap_content"  
 
    android:text="@string/hello" 
 
    /> 
 
     
 
    <Button 
 
            android:id="@+id/parseButton" 
 
            android:layout_width="fill_parent" 
 
            android:layout_height="wrap_content" 
 
            android:text="paresButton" 
 
    /> 
 
</LinearLayout> 
复制代码文件解析类:  
Java代码 
package android.xml.sax; 
 
 
 
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,age,tagName; 
 
         
 
        @Override 
 
        public void startDocument() throws SAXException { 
 
                // TODO Auto-generated method stub 
 
                super.startDocument(); 
 
                System.out.println("---------startDocument---------"); 
 
        } 
 
 
 
        @Override 
 
        public void endDocument() throws SAXException { 
 
                // TODO Auto-generated method stub 
 
                super.endDocument(); 
 
                System.out.println("---------endDocument---------"); 
 
        } 
 
 
 
         
 
        @Override 
 
        /** 
 
         * 开始解析元素 
 
         * String uri:URI的名称空间URI 
 
         * String localName:不带前缀的元素(标签)名称 
 
         * String name:带前缀的元素(标签)名称 
 
         * Attributes attributes:标签的属性 
 
         */ 
 
        public void startElement(String uri, String localName, String name, 
 
                        Attributes attributes) throws SAXException { 
 
                System.out.println("name: "+name); 
 
                tagName = localName; 
 
                if (tagName.equals("wroker")){ 
 
                        for(int i =0;i<attributes.getLength();i++){ 
 
                                //第i个属性的名字,和第i个属性的值 
 
                                System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i)); 
 
                        } 
 
                } 
 
        } 
 
 
 
        @Override 
 
        public void endElement(String uri, String localName, String name) 
 
                        throws SAXException { 
 
                // 在worker解析完之后,会打印出所有得到的数据 
 
                if (localName.equals("worker")){ 
 
                        printout(); 
 
                } 
 
        } 
 
 
 
        @Override 
 
        /** 
 
         * 得到标签中间的内容 
 
         * char[] ch:标签里的内容(标签内读取出来的内容都会放在这个数组里面) 
 
         * int start:字符数组的起始位置(从数组的哪一位开始) 
 
         * int length:字符数组的起始位置(到后面多少位) 
 
         */ 
 
        public void characters(char[] ch, int start, int length) 
 
                        throws SAXException { 
 
                if (tagName.equals("name")) 
 
                        name = new String(ch,start,length); 
 
                else if (tagName.endsWith("sex")) 
 
                        sex = new String(ch,start,length); 
 
                else 
 
                        age = new String(ch,start,length); 
 
        } 
 
         
 
        public void printout(){ 
 
                System.out.println("name: "+name); 
 
                System.out.println("sex: "+sex); 
 
                System.out.println("age: "+age); 
 
        } 
 
} 
复制代码Activity类:  
Java代码 
package android.xml.sax; 
 
 
 
import java.io.IOException; 
 
import java.io.Reader; 
 
import java.io.StringReader; 
 
 
 
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.utils.HttpDownloader; 
 
import android.view.View; 
 
import android.view.View.OnClickListener; 
 
import android.widget.Button; 
 
 
 
public class XMLSAXTest extends Activity { 
 
    /** Called when the activity is first created. */ 
 
         
 
        private Button parseButton = null; 
 
         
 
    @Override 
 
    public void onCreate(Bundle savedInstanceState) { 
 
        super.onCreate(savedInstanceState); 
 
        setContentView(R.layout.main); 
 
         
 
        parseButton = (Button)findViewById(R.id.parseButton); 
 
        parseButton.setOnClickListener(new ParesButtonOnClickListener()); 
 
    } 
 
     
 
    class ParesButtonOnClickListener implements OnClickListener{ 
 
                public void onClick(View v) { 
 
                        // TODO Auto-generated method stub 
 
                        HttpDownloader hd = new HttpDownloader(); 
 
                        String resultStr = hd.download("http://dl5.csdn.net/fd.php?i=768128918158274&s=5a92e2d55af5561a2bb3c16216cc2771"); 
 
                        System.out.println("resultStr: "+resultStr); 
 
                        try { 
 
                                //创建一个SAXParesFactory工厂对象 
 
                                SAXParserFactory factory = SAXParserFactory.newInstance(); 
 
                                //创建一个XMLReader对象 
 
                                XMLReader xmlReader = factory.newSAXParser().getXMLReader(); 
 
                                //为XMLReader设置内容处理器 
 
                                xmlReader.setContentHandler(new MyContentHandler()); 
 
                                //开始解析文件 
 
                                xmlReader.parse(new InputSource(new StringReader(resultStr))); 
 
                        } catch (Exception e) { 
 
                                e.printStackTrace(); 
 
                        } 
 
                         
 
                } 
 
    } 
 
} 
复制代码 
 
 
 
 
除此之外还需要上传文件的类,前面已经写过了在这里就不贴代码了  
 
 
项目源码已经上传,有需要的可以下载。 
 
  XML_SAXTest.rar (51.88 KB, 下载次数: 2) |   
 
 
 
 |