xml——05(sax解析)

1、sax的解析过程

解析xml有两种技术 dom 和sax

根据xml的层级结构在内存中分配一个树形结构
** 把xml中标签,属性,文本封装成对象

* sax方式:事件驱动,边读边解析
在javax.xml.parsers包里面
	** SAXParser
		此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
		- parse(File f, DefaultHandler dh) 
			* 两个参数
			** 第一个参数:xml的路径
			** 第二个参数:事件处理器(DefaultHandler类)
			  (自己写一个类来继承DefaultHandler,重写下面解析的时候需要的三个方法)

	** SAXParserFactory
		实例 newInstance() 方法得到
* 画图分析一下sax执行过程
	* 当解析到开始标签时候,自动执行startElement方法
	* 当解析到文本时候,自动执行characters方法
	* 当解析到结束标签时候,自动执行endElement方法

在这里插入图片描述

2、使用jaxp的sax方式解析xml

sax方式不能实现增删改操作,只能做查询操作

打印出整个文档

public class TextSax {
	public static void main(String[] args) throws  Exception {
		/*
		 * 1、创建解析器工厂
		 * 2、创建解析器
		 * 3、执行parse方法
		 * 
		 * 4、自己建一个类继承DefaultHandler类
		 * 5、重写类中的startElement()characters()和endElement()方法
		 * 
		 */
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser sp=spf.newSAXParser();
		sp.parse("src/p1.xml", new MyDefault1());	
	}
}
class MyDefault1 extends DefaultHandler{
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
		System.out.print("<"+qName+">");
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		System.out.println("text"+new String(ch,start,length));
	}

	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		System.out.println("</"+qName+">");
	}
}

获取到所有的name元素的值

public class TextSax1 {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		/*
		* 获取到所有的name元素的值
		* 定义一个成员变量 flag= false
		* 判断开始方法是否是name元素,如果是name元素,把flag值设置成true
		* 如果flag值是true,在characters方法里面打印内容
		* 当执行到结束方法时候,把flag值设置成false
		 */
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser sp=spf.newSAXParser();
		sp.parse("src/p1.xml", new MyDefault2());
	}
}
class MyDefault2 extends DefaultHandler{
	boolean flag=false;
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
		//判断qName是否是name元素
		if("name".equals(qName)) {
			flag=true;
		}
	}
	
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		//当flag的值为true的时候,表示解析到name元素
		super.characters(ch, start, length);
		if(flag==true) {
			System.out.println(new String(ch,start,length));
		}
	}

	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		//把flag元素设置为false,表示name元素结束
		if("name".equals(qName)) {
			flag=false;
		}
	}
}

获取第一个name元素的值

public class TextSax2 {
	public static void main(String[] args) throws Exception {
	/*
	 * 获取第一个name元素的值
	 * 定义一个成员变量 idx=1
	 * 在结束方法时候,idx+1 idx++
	 * 想要打印出第一个name元素的值,
		- 在characters方法里面判断,
		-- 判断flag=true 并且 idx==1,在打印内容
	 */
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser sp=spf.newSAXParser();
		sp.parse("src/p1.xml", new MyDefault3());
	}
}
class MyDefault3 extends DefaultHandler{
	int idx=1;
	boolean flag=false;
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
		if("name".equals(qName)) {
			flag=true;
		}
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		if(flag==true&&idx==1) {
			System.out.println(new String(ch,start,length));
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		if("name".equals(qName)&& idx==1) {
			flag=false;
			idx++;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值