DOM、SAX 和 StAX XML 解析器之间有啥区别? [关闭]

Posted

技术标签:

【中文标题】DOM、SAX 和 StAX XML 解析器之间有啥区别? [关闭]【英文标题】:What are the differences between DOM, SAX and StAX XML parsers? [closed]DOM、SAX 和 StAX XML 解析器之间有什么区别? [关闭] 【发布时间】:2014-01-27 23:05:04 【问题描述】:

我正在使用 Apache Tomcat 开发一个 RSS 提要聚合器。我想知道使用哪个解析器来读取 RSS 提要。我应该使用 DOM、SAX 还是 StAX?我知道有专门用于使用 java 读取 RSS 提要的库,但由于这是一个大学项目,我不应该使用这些库。 谢谢。

【问题讨论】:

可能已经回答了***.com/questions/373833/… 无论如何这是一个以意见为导向的问题,可能不适合 SO @icrovett - 您的链接指向一个询问有关 xml 解析器的具体实现的问题。这个问题询问解析器使用的各种模型。 【参考方案1】:

这主要取决于您的需求。每个都有自己的特点。

DOM - 将整个事物拉入内存并在其中四处走动。适用于您想要处理复杂事情的相对较小的 XML 块。 XSLT 使用 DOM。

SAX - 在 XML 到达时遍历它,观察飞过的事物。适用于大量数据或相对简单的处理。

StAX - 与 SAX 非常相似,但不是响应在流中找到的事件,而是通过 xml 进行迭代 - 请参阅 When should I choose SAX over StAX? 以了解哪种方法最好。

Parsing XML using DOM, SAX and StAX Parser in Java 在这里进行了很好的讨论 - 由 Mohamed Sanaulla 撰写。注意:他的 SAX 解析器有问题 - 他应该追加字符,而不是替换它们,因为字符数据是累积的并且可能以块的形式到达。

  content = String.copyValueOf(ch, start, length);

应该是

  content += String.copyValueOf(ch, start, length);

也是 Kaan Yamanyar Differences between DOM, SAX or StAX 的一篇博文。

【讨论】:

此外,如果我们想在树中来回导航,DOM 非常有用,比如寻找兄弟姐妹等。使用 SAX,一旦我们通过一个节点,它就会丢失,除非我们将它放在用户定义的数据结构中。 @prabugp - 这就是我所说的在里面走动,而不是看着飞过的东西。感谢您强调这一点。【参考方案2】:

我不知道 StAX,但我可以对 DOM 和 SAX 说点什么:

Dom 将 XML 数据作为对象模型保存在内存中。优点是,您可以方便快捷地访问和更改内存中的数据。缺点是内存消耗大。

SAX 使用某种事件模式来读取数据,并且不会将任何数据保存在内存中。优点是速度相对较快,不需要太多内存空间。缺点是,如果您想以方便的方式更改数据,则必须创建自己的数据模型。

与 SAX 相比,Dom 的使用稍微复杂一些。

如果您需要将大数据解析为流,请使用 SAX。如果您想在内存中保存完整的数据以使用它,并且数据大小足够小以安全地放入内存,请使用 DOM。

例如:XSLT 不适用于 SAX,因为它需要在读取数据流时向前看。所以它使用 DOM,即使这会导致大数据的内存问题。

希望有所帮助:-)

【讨论】:

以上是关于DOM、SAX 和 StAX XML 解析器之间有啥区别? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

笔记:XML-解析文档-流机制解析器(SAXStAX)

xml笔试题

比较流行 java xml解析器有几种 名子是啥?

为啥 sax 解析比 dom 解析快?以及 stax 是如何工作的?

stax xml 验证

XML 试题