Java SAX 库
SAX (Simple API for XML)是Java中应用最广泛的 XML API,被认为是事实上的标准。尽管它最初是作为Java专有的库,但现在它是一个众所周知的 API,分布在各种编程语言上。它是一个开源项目,最近已切换到SourceForge 项目基础架构,这样可以更轻松地跟踪高容量 xml-dev 列表之外的开放 SAX 问题。截至 2018 年 1 月 10 日的当前最新版本是SAX 2.0 。它使用事件驱动的串行访问机制来访问 XML 文档,并且经常被需要访问 XML 文档的小程序使用,因为它是可用于解析 XML 文档的最快且内存消耗最少的 API。 SAX 使用的机制使其独立于之前的元素,即它是独立于状态的。
设置DOM(文档对象模型)比设置 SAX 更容易,并且 SAX 比 DOM 更难可视化,因为它的解析器根据调用的事件解释 XML 项。这也意味着您不能返回到 SAX 解释的特定部分或重新排列它们。因此,用户繁重的应用程序应该使用 DOM 而不是 SAX 。
但是,即使您使用的是 DOM,也有很多理由让您熟悉 SAX 。以下是SAX 相对于 DOM 的各种优势:
- 相同的错误处理: SAX 和 DOM 生成的异常类型是相同的。
- 处理验证错误:如果要在发生验证错误时抛出异常,则需要了解 SAX 错误处理机制。
- 转换现有数据:在 DOM 中,您可以将现有数据集转换为 XML。但是为了能够实现它,您需要对 SAX 有基本的了解。
为什么或何时使用 SAX?
SAX 使用事件模型结构将数据转换或解析为 XML,只需修改现有应用程序以在读取数据时传递 SAX 事件。
SAX 快速且高效,但它的事件模型使其最适用于状态无关过滤。当遇到元素标签和遇到文本时,它会调用不同的方法。因此,只要处理是独立于状态的(意味着它不依赖于之前出现的元素),那么 SAX 就可以正常工作。
它不会像 DOM 那样创建 XML 数据的内部表示(树结构),而是在读取数据时简单地将数据发送到应用程序,因此消耗更少的内存。
SAX API 的作用类似于串行 I/O 流,因此强烈建议将其用于需要 XML 解析器的简单应用程序。
SAX 库中的类: SAX 库中的类很少,使解析工作非常容易。这些都是:
- HandlerBase:此类为 DocumentHandler、ErrorHandler、DTDHandler 和 EntityResolver 提供默认实现:当用户未指定处理程序时,解析器编写者可以使用它来提供默认实现,并且应用程序编写者可以将其子类化以简化处理程序编写。
- InputSource此类允许 SAX 应用程序将有关输入源的信息封装在单个对象中,该对象可能包括公共标识符、系统标识符、字节流(可能具有指定的编码)和/或字符流。
例子:
要解析的 XML 文件:
Baibhav
Ojha
解析文件的Java程序:
// Java Code to describe implementation
// of SAX library
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReadXMLFile {
public static void main(String argv[])
{
try {
SAXParserFactory factory
= SAXParserFactory.newInstance();
SAXParser saxParser
= factory.newSAXParser();
DefaultHandler handler
= new DefaultHandler() {
boolean bfname = false;
boolean blname = false;
public void startElement(String uri,
String localName,
String qName,
Attributes attributes)
throws SAXException
{
if (qName.equalsIgnoreCase("firstname")) {
bfname = true;
}
if (qName.equalsIgnoreCase("lastname")) {
blname = true;
}
}
public void characters(char ch[],
int start,
int length)
throws SAXException
{
if (bfname) {
System.out.println("First Name : "
+ new String(ch,
start,
length));
bfname = false;
}
if (blname) {
System.out.println("Last Name : "
+ new String(ch,
start,
length));
blname = false;
}
}
};
saxParser.parse("C:\\gfg.xml", handler);
}
catch (Exception e) {
e.printStackTrace();
}
}
}