📜  Java中的 StAX 与 SAX 解析器

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

Java中的 StAX 与 SAX 解析器

流式处理 XML 的 API,称为 StAX,是一种用于读取和写入 XML 文档的 API。它是在Java 6 中引入的,被认为优于 SAX 和 DOM,后者是Java中访问 XML 的其他方法。 Java提供了几种访问 XML 的方法 [API]。传统上,XML API 要么——

  • 基于树的[例如StAX,DOM]:整个文档作为树结构被读入内存,以供调用应用程序随机访问
  • 基于事件的 [例如 SAX]:应用程序注册以接收事件,因为在源文档中遇到这些实体

StAX 是这两个对立面之间的中位数。创建 StAX 是为了解决两个最流行的解析 API(第一个 SAX 和第二个 DOM)中的限制。在 StAX 中,程序入口点是一个光标,即表示文档中的一个点。应用程序将光标向前移动,以便根据需要从解析器中提取信息。这与将数据推送到应用程序的基于事件的 API(如 SAX)非常不同。因此,这需要应用程序根据需要维护事件之间的状态,以跟踪文档中的位置

StAX 可以进行 XML 读取和写入,而 SAX 只能进行 XML 读取。 StAX 是 XML 的 Pull-Parsing 模型,它避免了大多数陷阱。应用程序可以通过从解析器中提取事件来控制解析 XML 文档。与 SAX StAX 1 一样,它是一个独立于解析器的纯Java API,它基于可由多个解析器实现的接口。 StAX API 的主要主要目标是通过公开一个简单的基于迭代器的 API 将解析控制权交给程序员。这允许程序员请求下一个事件,即[拉事件]并允许以程序方式存储状态

萨克斯

SAX 是一个推送 APL。 SAX 解析器遍历 XML 并调用开发人员提供的处理程序对象上的方法。当 SAX 解析器遇到 XML 元素的开头时,它会在处理程序对象上调用 start Element。它将信息从 XML 推送到开发者的对象中,因此得名 push API

SAX 也称为事件驱动 API。这是因为当在 XML 文档中找到元素、文本、注释等时,将通过事件调用通知处理程序对象 DOM 允许对文档进行随机访问,而 SAX 需要较小的内存占用并且通常要快得多。这两种方式都是相反的。基于树的 API 允许无限制的随机访问和操作,而基于事件的 API 是一次性通过源文档。

差异表

下表描述了可用 XML Parsing API 之间的功能差异:

Features

StAX

SAX

API TypeAPI Type is Pull, streamingAPI Type is Push, streaming
Ease of UseStAX have Usability HighSAX Have Usability Medium
XPath Capability StAX has No XPath Capability SAX has No XPath Capability 
CPU and Memory EfficiencyCPU and Memory Efficiency is GoodCPU and Memory Efficiency is Good
Forward OnlyThe Forward Only Feature is PresentThe Forward Only Feature is Present
Read XMLThe Feature of Reading XML is PresentThe Feature of Reading XML is Present
Write XMLThe Feature of Writing XML is PresentThe Feature of Writing XML is Not Present
Create, Read, Update, DeleteThe Command Features like Create, Read, Update, Delete are Not PresentThe Command Features like Create, Read, Update, Delete are Not Present