SAX解析

前面已经提到了XML解析的方式。

今天就讲一下SAX解析,相比于DOM解析,它的语义更加清楚,而且能够控制是否停止解析,而DOM解析会将XML文件全部解析一遍。

以下是代码:

package internet;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

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 SaxParseDemo {

	// HashMap<String, ArrayList<OutlineInfo>>

	String qname;

	/**
	 * 
	 * @param inputStream
	 * @throws ParserConfigurationException
	 *             属性设置异常
	 * @throws SAXException
	 * @throws IOException
	 */
	public static void saxParse(InputStream inputStream)
			throws ParserConfigurationException, SAXException, IOException {
		// 1.sax解析器的工厂
		SAXParserFactory spf = SAXParserFactory.newInstance();
		// 2.sax解析器
		SAXParser saxParser = spf.newSAXParser();
		// 3.声明MyDefaultHandler对象
		SaxParseDemo demo = new SaxParseDemo();
		MyDefaultHandler mdh = demo.new MyDefaultHandler();
		// 4.解析流
		saxParser.parse(inputStream, mdh);// dh:帮助类的DefaultHandler的对象
	}

	/**
	 * 帮助类
	 */
	public class MyDefaultHandler extends DefaultHandler {
		/**
		 * 开始解析整个xml文档
		 */
		@Override
		public void startDocument() throws SAXException {
			super.startDocument();
			// 新建map对象
		}

		/**
		 * 开始解析标签
		 * 
		 * @parm uri-->前缀
		 * @parm localName-->标签名,没有前缀
		 * @parm qName-->标签名,有前缀,例如ViewPager的前缀就是包名
		 * @parm attributes-->属性
		 */
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			super.startElement(uri, localName, qName, attributes);
			// attributes.getLength();//属性的个数
			// //第一个属性的值
			// attributes.getValue(0);//用index最好,通过标签获取

			if ("person".equals(qName) && attributes.getLength() == 1) {
				// 新建封装类对象
				// 设置id属性
			} else {
				qname = qName;
			}
		}

		/**
		 * 标签头和标签尾之前的内容
		 * 
		 * @parm ch-->字符数组可能存在很长的内容,比如ch只有100个字符,读取的是1024,就会浪费很多空格
		 */
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			super.characters(ch, start, length);
			String content = new String(ch, start, length);
		}

		/**
		 * 结束标签
		 * 
		 */
		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			super.endElement(uri, localName, qName);
			qname = null;
			if (qName.equals("person")) {
				// 置空对象
			}
		}
		
		/**
		 * 结束整个XML文件
		 */
		@Override
		public void endDocument() throws SAXException {
			super.endDocument();
		}
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值