解析 XML 通常有两种方式,DOM 和 SAX。DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构。但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的。
SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API
在其解析您的文档时发生一定事件的时候会通知您。
在Tomcat服务器上有一个xml文件如下,这个xml文件就是接下来要解析的文件
<?xml version="1.0" encoding="utf-8"?> <workers> <worker id="AQ01"> <name>Zhang</name> <sex>男</sex> <status>经理</status> <address>深圳</address> <money>4000</money> </worker> <worker id="AQ02"> <name>Deng</name> <sex>男</sex> <status>员工</status> <address>广州</address> <money>2000</money> </worker> <worker id="AQ03"> <name>Lili</name> <sex>女</sex> <status>员工</status> <address>北京</address> <money>4000</money> </worker> </workers>
SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler;实际上DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现;所以我们只要继承DefaultHandler就行了,然后覆盖我们感兴趣的方法进行处理。
package com.example.xml; 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; /** * 开始解析xml文件 */ public void startDocument() throws SAXException { System.out.println("````````begin````````"); } /** * 解析xml文件结束 */ 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("startElement " + 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(); } }在Activity中添加一个按钮来触发下载和解析xml文件
package com.example.xml; import java.io.StringReader; import javax.xml.parsers.SAXParserFactory; 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; import com.example.utils.HttpDownloader; public class MainActivity extends Activity { private Button parseBtn = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); parseBtn = (Button)findViewById(R.id.parse); parseBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub HttpDownloader hd = new HttpDownloader(); String resultStr = hd.download("http://192.168.0.152:8080/mp3/test.xml"); //System.out.println("parseBtn " + 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(); } } }); } }
样式代码
点击打开链接