import java.util.Stack; |
import org.xml.sax.*; |
import org.xml.sax.helpers.*; |
import javax.xml.parsers.*; |
/** |
* |
* xml文件解释器 |
* |
* SAX |
* |
* DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令, |
* 然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档, |
* 所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。 |
* |
* SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法, |
* 告诉该方法制定的标签已经找到 |
* 。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时 |
* ,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。 |
*/ |
public class MyXMLReader extends DefaultHandler { |
Stack tags = new Stack(); |
public MyXMLReader() { |
super (); |
} |
public static void main(String args[]) { |
long lasting = System.currentTimeMillis(); |
try { |
SAXParserFactory sf = SAXParserFactory.newInstance(); |
SAXParser sp = sf.newSAXParser(); |
MyXMLReader reader = new MyXMLReader(); |
sp.parse( new InputSource( "data.xml" ), reader); |
} catch (Exception e) { |
e.printStackTrace(); |
} |
System.out.println( "运行时间:" + (System.currentTimeMillis() - lasting) |
+ "毫秒" ); |
} |
public void characters( char ch[], int start, int length) |
throws SAXException { |
String tag = (String) tags.peek(); |
if (tag.equals( "NO" )) { |
System.out.print( "车牌号码:" + new String(ch, start, length)); |
} |
if (tag.equals( "ADDR" )) { |
System.out.println( "地址:" + new String(ch, start, length)); |
} |
} |
public void startElement(String uri, String localName, String qName, |
Attributes attrs) { |
tags.push(qName); |
} |
} |