一、什么是SAX
SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包。
作为接口,SAX是事件驱动型XML解析的一个标准接口。
二、SAX的原理
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
在文档的开始和结束时触发文档处理事件。
在文档内每一XML元素接受解析的前后触发元素事件。
任何元数据通常都由单独的事件交付。
在处理文档的DTD或Schema时产生DTD或Schema事件。
产生错误事件用来通知主机应用程序解析错误。
三、SAX模型
四:解析文档过程
对于如下文档:
<doc>
<para>Hello,world!</para>
</doc>
在解析文档的过程中会产生如下一系列事件:
五、SAX的常用接口介绍
ContentHandler接口
ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
六、具体的例子
需要解析的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文章均为原创,转载请以链接形式标明本文地址