SAX解析XML文件

一、什么是SAX

SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包。

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

二、SAX的原理

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

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

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

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

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

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

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

三、SAX模型

image

四:解析文档过程

对于如下文档:

<doc>

<para>Hello,world!</para>

</doc>

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

image

 

五、SAX的常用接口介绍

ContentHandler接口

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

image

六、具体的例子

需要解析的XML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<workers>
    <worker id="AD01">
      <name>Mark</name>
      <sex></sex>
      <status>经理</status>
      <address>北京</address>
      <money>4000</money>
    </worker>
    <worker id="AD02">
      <name>lucy</name>
      <sex></sex>
      <status>员工</status>
      <address>上海</address>
      <money>1000</money>
    </worker>
    <worker id="AD03">
      <name>lily</name>
      <sex></sex>
      <status>员工</status>
      <address>北京</address>
      <money>3000</money>
    </worker>
  </workers>

MyContentHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyContentHandler extends DefaultHandler {
    String hisname, address, money, sex, status;
    String tagName;

    public void startDocument() throws SAXException {
        System.out.println("````````begin````````");
    }

    public void endDocument() throws SAXException {
        System.out.println("````````end````````");
    }

    public void startElement(String namespaceURI, String localName,
            String qName, Attributes attr) throws SAXException {
        tagName = localName;
        if (localName.equals("worker")) {
            //获取标签的全部属性
            for (int i = 0; i < attr.getLength(); i++) {
                System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i));
            }
        }
    }

    public void endElement(String namespaceURI, String localName, String qName)
            throws SAXException {
        //在workr标签解析完之后,会打印出所有得到的数据
        tagName = "";
        if (localName.equals("worker")) {
            this.printout();
        }
    }
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if (tagName.equals("name"))
            hisname = 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);
    }

    private void printout() {
        System.out.print("name: ");
        System.out.println(hisname);
        System.out.print("sex: ");
        System.out.println(sex);
        System.out.print("status: ");
        System.out.println(status);
        System.out.print("address: ");
        System.out.println(address);
        System.out.print("money: ");
        System.out.println(money);
        System.out.println();
    }

}

XMLActitity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;

import mars.utils.HttpDownloader;

import org.xml.sax.InputSource;
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 XMLActitity extends Activity {
    /** Called when the activity is first created. */
    private Button parseButton ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        parseButton = (Button)findViewById(R.id.parseButton);
        parseButton.setOnClickListener(new ParseButtonListener());
    }
   
    class ParseButtonListener implements OnClickListener{
        @Override
        public void onClick(View v) {
            HttpDownloader hd = new HttpDownloader();
            String resultStr = hd.download("http://******/test.xml");
            System.out.println(resultStr);
            try{
                //创建一个SAXParserFactory
                SAXParserFactory factory = SAXParserFactory.newInstance();
                XMLReader reader = factory.newSAXParser().getXMLReader();
                //为XMLReader设置内容处理器
                reader.setContentHandler(new MyContentHandler());
                //开始解析文件
                reader.parse(new InputSource(new StringReader(resultStr)));
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

 

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/android-sax-xml.html

本文链接:http://www.alonemonkey.com/android-sax-xml.html