DOM,SAX和StAX XML解析器之间有什么区别?

时间:2014-01-09 11:54:11

标签: java xml dom sax stax

我正在使用Apache Tomcat开发RSS feed聚合器。我想知道使用哪个解析器来读取RSS源。我应该使用DOM,SAX还是StAX?我知道有一些特定的库可以用java阅读RSS源,但由于这是一个大学项目,我不应该使用它们。 谢谢。

2 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:3)

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

Dom将XML-Data作为对象模型保存在内存中。优点是,您可以在内存中以方便快捷的方式访问和更改数据。缺点是,它具有很高的内存消耗。

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

与SAX相比,Dom使用起来有点复杂。

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

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

希望有所帮助: - )