使用 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 标记表示为 Elements,它特别使用与属性相关的方法扩展 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() 的网关。