使用SAX方式解析XML文件

SAX方式解析XML的步骤:

1、通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory

2、SAXParseFactory实例的newSAXParse()方法返回SAXParser实例parser

3、创建一个类继承DefaultHandle,重写方法进行业务已处理,创建这个类的实例handle


新建一个XML文件demo.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book id="1">
     <name>放学后</name>
     <author>lcb</author>
     <year>2010</year>
     <price>25</price>
  </book>

  <book id="2">
     <name>你的孤独,虽败犹荣</name>
     <author>刘同</author>
     <year>2011</year>
     <price>30</price>
  </book>
</bookstore>

新建SAXHandler.java类并继承DefaultHandle,并重写startElement()、endElement()、startDocument()、endDocument()方法

package com.imooc.io;


import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXHandler extends DefaultHandler {
     /**
      * 解析XML的开始标签
      */
	public void startElement(String uri, String localName, 
			String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
		//开始解析book元素
		if(qName.equals("book")){
			//已知book元素属性的名称,根据属性名获取属性值
			//String value = attributes.getValue("id");
			//System.out.println("book的属性值是:"+value);
			//获取book元素属性的长度
			int num = attributes.getLength();
			for(int i = 0; i<num; i++){
				System.out.println("book元素第"+(i+1)+"个属性名是:"+attributes.getQName(i));
				System.out.println("book元素第"+(i+1)+"个属性值是:"+attributes.getValue(i));
			}
		}
		//如果不是book标签和bookstore标签,进行输出节点名
		else if(!qName.equals("book") && !qName.equals("bookstore")){
			System.out.println("节点名是:"+qName);
		}
	}
	
	/**
	 * 用于获取节点名对应的节点值
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		//使用String(byte[] bytes,int offset,int length)构造方法把字符数组传递进去
		String value = new String(ch, start, length);
		/**
		 * 因为characters解析时会把多余空格一起解析,造成输出多余空格,
		 * 用trim方法去除空格后,并且不等于空格后才进行输出
		 */
		if(!value.trim().equals("")){
			System.out.println(value);
		}
		
	}
	
	/**
	 * 解析XML的结束标签
	 */
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		
	}
	
	/**
	 * 用来标识解析xml文档的开始
	 */
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		System.out.println("SAX开始解析XML");
	}
	
	/**
	 * 用来标识解析xml文档的结束
	 */
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		System.out.println("SAX解析XML完成");
	}
}



在新建SAXTest.java,进行测试:

package com.imooc.io;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SAXtest {
	public static void main(String[] args){
		//通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			//SAXParseFactory实例的newSAXParse()方法返回SAXParser实例parser
			SAXParser parser = factory.newSAXParser();
			//创建SAXHandler的对象
			SAXHandler handler = new SAXHandler();
			parser.parse("demo.xml", handler);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果为:

SAX开始解析XML
book元素第1个属性名是:id
book元素第1个属性值是:1
节点名是:name
放学后
节点名是:author
lcb
节点名是:year
2010
节点名是:price
25
book元素第1个属性名是:id
book元素第1个属性值是:2
节点名是:name
你的孤独,虽败犹荣
节点名是:author
刘同
节点名是:year
2011
节点名是:price
30
SAX解析XML完成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值