何时使用 SAX

想要将现有数据转换为 XML 时,了解 SAX 事件模型将很有帮助。转换过程的关键是修改现有应用程序以在读取数据时传递 SAX 事件。

SAX 快速高效,但是其事件模型使其对于此类独立于状态的筛选最有用。例如,当遇到元素标签时,SAX 解析器将在您的应用程序中调用一个方法,而在找到文本时调用另一个方法。如果您正在执行的处理是与状态无关的(这意味着它不依赖于之前的元素),那么 SAX 可以正常工作。

另一方面,对于状态相关的处理,程序需要对元素 A 下的数据执行某项操作,但对元素 B 下的数据进行某些操作,则将使用诸如 XML 的 Streaming API(StAX)之类的提取解析器。成为更好的选择。使用拉式解析器,您可以在代码中的任何时候获得下一个节点,无论碰巧是下一个。因此,很容易改变处理文本的方式(例如),因为您可以在程序中的多个位置处理文本(有关更多详细信息,请参见Further Information)。

SAX 所需的内存比 DOM 少得多,因为 SAX 不会像 DOM 那样构造 XML 数据的内部表示(树结构)。相反,SAX 只是在读取数据时将其发送到应用程序。然后,您的应用程序就可以对所看到的数据做任何想做的事情。

拉式解析器和 SAX API 都像 String 行 I/O 流一样。您可以看到流进来的数据,但是不能返回到较早的位置或向前跳转到另一个位置。通常,当您只想读取数据并让应用程序对其执行操作时,此类解析器就可以很好地工作。

但是,当您需要修改 XML 结构时-尤其是当您需要交互地修改它时-内存结构更有意义。 DOM 就是这样一种模型。但是,尽管 DOM 为大型文档(例如书籍和文章)提供了许多强大的功能,但它也需要大量复杂的编码。在下一课的何时使用 DOM中突出显示了该过程的详细信息。

对于更简单的应用程序,这种复杂性可能完全没有必要。对于更快的开发和更简单的应用程序,一种面向对象的 XML 编程标准,例如 JDOM(http://www.jdom.org)和 DOM4J(http://www.dom4j.org/),可能更有意义。