一、介绍
新建一个类XmlParseHandler.java,该类需要继承DefaultHandler
或者实现ContentHandler
接口,这里我们通过继承DefaultHandler
(实现了ContentHandler
接口)的方式,该类是SAX解析的核心所在,我们要重写以下几个我们关心的方法。
- startDocument():文档解析开始时调用,该方法只会调用一次
-
startElement(String uri, String localName, String qName,
Attributes attributes):标签(节点)解析开始时调用- uri:xml文档的命名空间
- localName:标签的名字
- qName:带命名空间的标签的名字
- attributes:标签的属性集
-
characters(char[] ch, int start, int length):解析标签的内容的时候调用
- ch:当前读取到的TextNode(文本节点)的字节数组
- start:字节开始的位置,为0则读取全部
- length:当前TextNode的长度
- endElement(String uri, String localName, String qName):标签(节点)解析结束后调用
- endDocument():文档解析结束后调用,该方法只会调用一次
二、xml文件
<?xml version = "1.0" encoding = "utf-8"?>
<books>
<book id="1">
<name>冰与火之歌</name>
<author>张三</author>
<pice>99</pice>
</book>
<book id="2">
<name>葫芦娃</name>
<pice>99</pice>
<year>1993</year>
</book>
</books>
三、XmlParseHandler
package com.da.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxparserHedler extends DefaultHandler {
int num = 0;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if ("book".equals(qName)) {
num++;
//已知book元素下的名称及个数
System.out.println("属性值:"+attributes.getValue("id"));
//未知book元素下的名称及个数
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println("第"+(i+1)+"个属性名:"+attributes.getQName(i)+"及属性值"+attributes.getValue(i));
}
}else if(!"book".equals(qName) && !"books".equals(qName)) {
System.out.print("节点名"+qName);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("book".equals(qName)) {
System.out.println("==========第"+num+"本==========");
}
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("SAX解析开始");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("SAX解析结束");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println(":"+value);
}
}
}
四、SAX解析XML案例Demo
package com.da.xml;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxTest {
public static void main(String[] args) {
//获取SAXParserFactory实例
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
try {
//通过SAXParserFactory获取SAXParser实例
SAXParser parser = parserFactory.newSAXParser();
SaxparserHedler saxproHedler = new SaxparserHedler();
parser.parse("books.xml", saxproHedler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
五、扩展
使用 SAX 解析将 XML 的内容和结构存入 JAVA 对象