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