📜  Java SAX 库

📅  最后修改于: 2022-05-13 01:55:36.715000             🧑  作者: Mango

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 库中的类很少,使解析工作非常容易。这些都是:

  1. HandlerBase:此类为 DocumentHandler、ErrorHandler、DTDHandler 和 EntityResolver 提供默认实现:当用户未指定处理程序时,解析器编写者可以使用它来提供默认实现,并且应用程序编写者可以将其子类化以简化处理程序编写。
  2. 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();
        }
    }
}