本文共 5022 字,大约阅读时间需要 16 分钟。
原文地址:SAX解析XML文档特点及样例作者:minxinwang88
SAX解析 逐行顺序解析,效率比DOM高。一旦遍历过的元素就无法再遍历。 对于大型的XML采用SAX解析方式来解析。 DOM解析是随机访问的,SAX是顺序访问的 SAX 解析 1. SAX ( Simple Application interface for XML ), 是一组程序设计接口,采用 observer 模式,将XML文件视为一个文字流的数据,在读取XML 元素时触发一系列的事件 2. 使用DOM 时是将xml 文件解析为一个树状结构,并对树中的节点进行操作 使用SAX 加载XML文件时,他的操作像打开一个“顺序的文件字符流”,在读到XML元素的开始标记,结尾标记和内容标记时将产生一系列的事件 如一个简单的XML文件:<hello><message>hello XML!</message></hello> 会相应的触发:startDocument, startElement, characters, endElement, endDocument, 只需编写这些事件处理程序就可以解析XML文件了 3. SAX 可以高效的使用内存,因为SAX 只是顺序的读取XML 文件的内容,并不会将XML 文件完全加载,这样就比DOM 的处理效率高 但SAX 只能读取XML 文件的内容,而不能更改XML 的内容,也不能随机访问XML 元素 4. 在SAX 中有4个处理器是要实现的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以处理不同的事件,这是比较麻烦的, 幸好SAX 定义了一个 DefaultHandler 类把这几个实现了,我们只需在 DefaultHandler中定义事件处理方法,然后注册到XMLReader,而SAXParser封装了XMLReader的实现类, SAXParser又是由SAXParserFactory提供的,所以我们实际用到的类只有:SAXParserFactory,SAXParser,DefaultHandler DefaultHandler 1)public void startDocument()throws SAXException 接到文档开始通知,空函数,需要重写该函数。 与此对应的方法还有: public void endDocument()throws SAXException 2)public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 接到元素开始通知,不执行任何操作。子类需要重写该函数 参数: uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 3)public void characters(char[] ch, int start, int length) throws SAXException 接收元素中字符开始通知 指定者: 接口 ContentHandler 中的 characters 参数: ch - 字符。 start - 字符数组中的开始位置。 length - 从字符数组中使用的字符数。 4)void endElement(String uri, String localName, String qName) throws SAXException 接收元素结束的通知 参数: uri - 名称空间 URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串 localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串 qName - 限定的 XML 名称(带前缀),如果限定名不可用,则为空字符串 5. SAX 的解析步骤: (1)写一个类继承 DefaultHandler, 实现自己的事件处理方法 (2)在主程序中建立 SAXParserFactory (3)可以设置这个factory 的参数 (4)从这个factory 得到SAXParser (5)解析XML文件 6.样例 需要解析的XML文档 <?xml version="1.0" encoding="UTF-8"?> <people xmlns:xsi="" xsi:noNamespaceSchemaLocation="F:JAVA_EE教程XML_codePersonInfoSchema.xsd"> <Person PersonId="E01"> <Name>minxin.wang</Name> <Address>wulumuqi.xinjiang.China</Address> <Tel>14799297669</Tel> <Fax>0991-6638770</Fax> <E-Mail>wang.minxin@zte.com.cn</E-Mail> </Person> <Person PersonId="E02"> <Name>huiqiong.zhang</Name> <Address>miquan.xinjiang.China</Address> <Tel>18799167160</Tel> <Fax>0991-3372818</Fax> <E-Mail>huiqiong.zhang@zte.com.cn</E-Mail> </Person> <Person PersonId="E03"> <Name>ping.wang</Name> <Address>guangdong.xinjiang.China</Address> <Tel>15816833753</Tel> <Fax>0991-6638770</Fax> <E-Mail>wp890510@sina.com.cn</E-Mail> </Person> </people> java程序 package com.sax.xml; import java.io.IOException; import java.util.Stack; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class sax_demo2 { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { // TODO Auto-generated method stub //step 1:创建工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //step 2:创建解析器 SAXParser saxparser=factory.newSAXParser(); //step 3:加载xml文档,进行解析 saxparser.parse("PersonInfoSchema.xml", new MyHandler2()); } } //创建XML的处理类,必须继承DefaultHandler class MyHandler2 extends DefaultHandler { private Stack<String> stack=new Stack<String>(); private String name; private String address; private String tel; private String fax; private String email; @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); } //对元素和属性的处理 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub stack.push(qName); for(int i=0;i<attributes.getLength();i++) { System.out.println("attrName: "+attributes.getQName(i)); System.out.println("attrValue: "+attributes.getValue(i)); } } //对元素中的字符进行处理 @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub String tag=stack.peek(); if("Name".equals(tag)) { name=new String(ch,start,length); } else if("Address".equals(tag)) { address=new String(ch,start,length); } else if("Tel".equals(tag)) { tel=new String(ch,start,length); } else if("Fax".equals(tag)) { fax=new String(ch,start,length); } else if("E-Mail".equals(tag)) { email=new String(ch,start,length); } } //接到元素结尾通知,对元素中的内容进行处理 @Override public void endElement(String uri, String localName, String qName) throws SAXException { stack.pop(); if("Person".equals(qName)) { System.out.println("姓名:"+name); System.out.println("地址:"+address); System.out.println("电话:"+tel); System.out.println("传真:"+fax); System.out.println("电邮:"+email); System.out.println(); } } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } }转载地址:http://bizmi.baihongyu.com/