使用 JAXP API 进行 XML 解析
XML 解析是对 XML 文档的解释,以便使用合理的构造来操作它们的内容,无论是节点,属性,文档,命名空间,还是与这些构造相关的事件。
Java 有一个用于 XML 文档处理的本机 API,称为 JAXP,或者用于 XML 处理的 Java API 。自 Java 1.4(JAXP v1.1)以来,JAXP 和参考实现已与每个 Java 发行版绑定在一起,并且从那时起已经发展。Java 8 随 JAXP 1.6 版一起提供。
API 提供了与 XML 文档交互的不同方式,它们是:
- DOM 接口(文档对象模型)
- SAX 接口(XML 的简单 API)
- StAX 接口(用于 XML 的 Streaming API)
DOM 接口的原理
DOM 接口旨在提供符合 W3C DOM 的解释 XML 的方式。各种版本的 JAXP 支持各种 DOM 级别的规范(最高级别 3)。
在文档对象模型界面下,XML 文档表示为树,从文档元素开始。API 的基本类型是 Node
类型,它允许从 Node
导航到它的父节点,它的子节点或它的兄弟节点(虽然,并非所有节点都可以有子节点,例如,Text
节点在树中是最终的,并且从来没有孩子)。XML 标记表示为 Element
s,它特别使用与属性相关的方法扩展 Node
。
DOM 接口非常有用,因为它允许将 XML 文档一行解析为树,并允许轻松修改构造的树(节点添加,抑制,复制……),最后进行序列化(返回磁盘) )修改后。然而,这是有代价的:树存在于内存中,因此,DOM 树对于大型 XML 文档并不总是实用的。此外,树的构造并不总是处理 XML 内容的最快方式,特别是如果一个人对 XML 文档的所有部分不感兴趣。
SAX 接口的原理
SAX API 是面向事件的 API,用于处理 XML 文档。在此模型下,XML 文档的组件被解释为事件(例如标签已打开,标签已关闭,遇到文本节点,已遇到评论)。 ..
SAX API 使用推送解析方法,其中 SAX Parser
负责解释 XML 文档,并调用委托( ContentHandler
) 上的方法来处理 XML 文档中发现的任何事件。通常,一个人从不编写解析器,但是一个人提供了一个处理程序来从 XML 文档中收集所有需要的信息。
SAX 接口通过仅保留解析器级别的最小必要数据(例如,命名空间上下文,验证状态)来克服 DOM 接口的限制,因此,只有由开发人员负责的 ContentHandler
保存的信息是记忆中。权衡的是,没有办法用这种方法“回溯到时间/ XML 文档”:虽然 DOM 允许 Node
返回其父级,但在 SAX 中没有这种可能性。
StAX 接口的原理
StAX API 采用与 SAX API(即事件驱动)处理 XML 类似的方法,唯一非常有意义的区别是 StAX 是拉解析器(其中 SAX 是推送解析器)。在 SAX 中,Parser
处于控制状态,并在 ContentHandler
上使用回调。在 Stax 中,你调用解析器,并控制何时/如果你想获取下一个 XML事件。
API 以 XMLStreamReader (或 XMLEventReader ) 开头,它们是开发人员以迭代器风格方式询问 nextEvent()
的网关。