Java中解析XML文件之SAX方式

1.SAX解析方式,是将XML文件逐行读进内存进行解析的。

2.首先编写一个SAXHandler(SAX处理类),这个类需要继承DefaultHandler类

3.在SAXHandler类中需要重写startElement方法(用来遍历XML文件的开始标签),endElement(用来遍历XML文件的结束标签),startDocument(用来标识XML文件解析开始),endDocument(用来标识XML文件解析结束)


4.当已知book元素下属性的名称,可根据属性名称获取属性值,如下所示:

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// 调用DefaultHandler类的startElement方法
		super.startElement(uri, localName, qName, attributes);
		if(qName.equals("book")){
			//已知book元素下属性的名称,根据属性名称获取属性值
			String value = attributes.getValue("id");
			System.out.println("book的id属性值为:"+value);
		}
	}

4.编写带main方法的测试类AnalysisXmlBySAX,如下所示:

package dom.yuehang.com;

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 AnalysisXmlBySAX {
	public static void main(String[] args){
		//获取一个SAXParserFactory的实例
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			//通过factory获取SAXParser实例
			SAXParser saxParser = factory.newSAXParser();
			//创建SAXParserHandler对象
			SAXHandler handler = new SAXHandler();
			saxParser.parse("datasource\\book.xml", handler);
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
运行结果如下图所示:

5.不知道book元素下属性的名称以及属性的个数时,可通过遍历的方式,如下所示:

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// 调用DefaultHandler类的startElement方法
		super.startElement(uri, localName, qName, attributes);
		if(qName.equals("book")){
			//不知道book元素下属性的名称以及属性的个数时
			int num = attributes.getLength();
			for(int i=0;i<num;i++){
				System.out.print("book第"+(i+1)+"个属性的名字:"+attributes.getQName(i));
				System.out.println("---属性的值是:"+attributes.getValue(i));
			}
		}
	}
6.如果想在每个book节点遍历后,加一些分隔字符串,并统计book节点的索引,首先需要在SAXHandler类中定义一个成员变量bookIndex,如下所示:



然后在SAXHandler类的重写方法endElement中添加以下代码:

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// 调用DefaultHandler类的endElement方法
		super.endElement(uri, localName, qName);
		if(qName.equals("book")){
			System.out.println("===================结束遍历第"+(++bookIndex)+"本书===================");
		}
	}
运行测试类AnalysisXmlBySAX,结果如下:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgQAAACnCAYAAABuFUT/AAAgAElEQVR4Ae19C3RcV3nuN37mbeVBHiYFolgO2OZRFZtUKpSXkkgurU2vTO/q7bWg90qJSyNxW5vaDS3tTW2w28vI7bIjd5Uq0Ke0wE5bSQStS8tDvsVuzMs2YKlKmkBICgE57zi25q7/nPnP/LNn7/OYl2ak/6wl773/9//tM3vvs88eT2pmZiYDvRQBRUARUAQUAUVgQSOwaEFnr8krAoqAIqAIKAKKgIfAEsbhyJEjXNVSEVAEFAFFQBFQBBYYAt6CgBYDmzZtWmCplz9dxTE+popVfKzKLUnYb926tdxm1V4EAvfff7+OsxEYKXtuEVikA/PcdoB6VwSqiYAuBqqJdr4vWoQR/nopArWKgJ4hqNWe0bgUAUVAEVAEFIEqIhCcIWCfI5/5MG666Y2YzaRwfnYxXr6wGOe9v0V+nWizPm358kvwcxveiMsuvZjVtVQEikbg2N/+ClKplF0/lcLa2z+GSxpeZecrVRFQBBQBRaAkBAoWBC+//BKuaH4/XrXoebw8m8LsLPByBrhwIYXzmQzOz6bwnYefwU2vugxPPP4E/ukLD+Htt74e179iRUmBqLIi8NzTT+Idv/6AFYhvf247vvbAB/GmX/wzXHqlLgqsIJVA/Nr0Wfzup05jNhP9LeSLly7CJ7rfiNdcqw8CJUCuqopAzSFQsCCgCDOpFJZftAJ46if40Sf/Emcf+Ecse8MbsGLH72Dpddfh/PmncfEll+KnGhtxIbUEpycf1wVBzXVt/QV0YTaF5ZevtAZ+zcpbgNQiPPTAh/Azv/QJXRRYUSqeePfAN3H1zDGkYiwIMosW4QPpl/GF3W8t3qFqKgKKQM0hYF0QcJRPfPQPsOz4Mdyy4jL86OsPYeajv4eGgwPM9soVV12FqdMP59Eq25jGwdua8d3tM0i32TyNo69hBBtn0rCybSpVpj361HP45mMz+Pb3z+KGhovxttdei1ddfWmVo0jgbrwPDftuwYnP34XGBGpJRWn36cKsrzXwTw/hi996BH/6G+24+opLsHjZxbjmhlVABvjXz96Nd/36XB3OqtL9NX0QtzUfxuYTn8ddlQQ920kvvngOS2dfwO9+/Hciu+3ju/bh+8+di5SrHYEx9KSOYFNmAO0lBLVt27ZA+8CBA0GdKmG8PEFtKAI1jEDoocKzX/gXXHH1lXhp6TJcdmUDXjh2HLPPP5+XzrmXXsLSpWHrCprAG9DQkPvrG88zsWAaz710Hr87/HX8xZcextpXX4uPvu8teN9bX4tvfO9Z/PXRR+LjQBP0bQcxHV+jLiRpQUBb1vT311/4Jv78Q+/BlZdf7LWvaf5tXHfr72Htez+FF55/NkY+hfddQ0MfFuitF4nX7IVzwfmNN121BGF/ZIzkwy+ahFOeTToXkuoZCxevEy4tBOhPLgCozvQ6SUPDVASsCIQuCC5atxaPPHUWj527gP/4yVksec1rsOiSS/IMzT
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值