更新时间:2020-11-30 17:49:26 来源:极悦 浏览1019次
SAX,全称 Simple API for XML,是一种以事件驱动的 XMl API,即XML 简单应用程序接口。解析 XML 元素名称和内容的关键是当 SAX 解析 XML 时,把元素的名称和内容及时保存起来,同时 XML 中可能会有很多同名的元素,要把元素名称和内容对应起来。
与 DOM 不同,SAX 提供的访问模式是一种顺序模式,这是一种快速读写 XML 数据的方式。当使用 SAX 分析器对 XML 文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
SAX 解析 XML 的一般步骤:
1.创建 SAXParserFactory 的对象
2.创建 SAXParser 对象 (解析器)
3.创建一个 DefaultHandler 的子类,需要重写5个方法
1)解析xml文档开始时调用
startDocument()
2)解析xml文档结束时调用
endDocument()
3)解析xml文档中的开始节点时调用
startElement(String uri, String localName, String qName, Attributes attributes)
4)解析xml文档中的结束节点时调用
endElement(String uri, String localName, String qName)
5)解析xml文档中的节点中的文本值时调用
characters(char[] ch, int start, int length)
4) 调用 parse 方法
了解了SAX 解析 XML 的步骤,我们开始进行实战解析:
DefaultHandler 子类:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class BookDefaultHandler extends DefaultHandler{
/** 解析xml文档开始时调用 */
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("------解析XML文档开始------");
}
/** 解析xml文档中的开始节点时调用 */
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// System.out.println("解析XML文档的开始节点");
System.out.print("<" + qName + " ");
/* 判断:如果是book节点,获取节点的属性值 */
if(qName.equals("book")) {
//获取所有的属性
int count = attributes.getLength();
for (int i = 0; i < count; i++) {
String attrName = attributes.getQName(i);
String attrValue = attributes.getValue(i);
System.out.print(attrName + "=\"" + attrValue
+ "\" ");
}
}
System.out.println(">");
}
/** 解析xml文档中的结束节点时调用 */
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("</" + qName + ">");
}
/** 解析xml文档中的节点中的文本值时调用 */
@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);
}
}
/** 解析xml文档结束时调用 */
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("------解析XML文档结束------");
}
}
SAX解析测试类:
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 TestSAXParse {
public static void main(String[] args)
throws ParserConfigurationException, SAXException, IOException {
//1) 创建 SAXParserFactory 的对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//2) 创建 SAXParser 对象 (解析器)
SAXParser parser = factory.newSAXParser();
//3) 创建一个 DefaultHandler 的子类,需要重写5个方法
BookDefaultHandler bdh = new BookDefaultHandler();
//4) 调用 parse 方法
parser.parse("book.xml", bdh);
}
}
尽管SAX解析XML不是XML的解析方式的唯一,但SAX解析XML仍在XML解析方式中占据一席之地,除了SAX解析XML采用事件驱动模式,对内存耗费比较小之外,SAX解析XML在只处理XML文件中的数据时无疑是最佳选择。当然SAX解析XML也不是没有缺点的,事实上SAX解析XML很难同时访问XML文件中的多处不同数据而被诟病。想要了解更多的XML知识,快来观看本站的XML教程吧,助你快速熟练掌握XML知识。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习