更快的多重解析:SAX或DOM

时间:2013-08-31 04:41:05

标签: java xml parsing dom xml-parsing

我读了很多帖子,说SAX比DOM快。我不确定我的问题是否愚蠢但我认为如果我们有大量内存,DOM必须更快。因为一旦树结构加载到内存中,它应该比SAX更快。

我需要一些澄清,请帮助我理解。 我有一个用例,我收到一个巨大的文件,每天解析多次。 我可以说在第一次解析时DOM可能比SAX慢一点,并且在DOM的情况下所有后续解析将非常快,因为它将整个文档结构加载到内存中并且重用它。如果是这样,那么我们怎么能说SAX比DOM更快。如果我错了,请纠正我。 如果明天我改变我的XSD并需要将新结构推送到内存中,那么有没有办法在不重新启动应用程序的情况下完成它。

1 个答案:

答案 0 :(得分:3)

我们在以下时间使用SAX:

  1. 我们确定只有一次通过该文件就足够了。顺便提一下,大部分时间都是如此。执行多次传递或使指针返回/前进的代码大部分时间都可以重构为一次通过。

  2. 当我们通过某些流媒体通道(例如通过网络)接收xml文件时,我们希望甚至在整个文件完全下载之前进行实时读取。 SAX可以使用部分下载的文件,DOM不能。

  3. 当我们对XML中的特定位置感兴趣时,而不是完整文档中。例如,Atom Feed最适合SAX,但要分析WSDL,您需要一个DOM。

  4. 我们在以下时间使用DOM:

    1. 好吧,单程不行。我们需要在文件中上下移动。

    2. 当XML在磁盘上时我们不需要实时读数。我们可以花时间,加载 它,阅读,分析,然后得出结论。

    3. 当你的老板要求在午餐前做这件事,你就不会打扰它。

    4. 现在回答你的问题

      您提供:

      1. 你有一个巨大的档案:........ SAX +1
      2. 解析多次:..... DOM +1
      3. 两者都获得平等的选票。添加您现有的知识库。 (熟悉SAX?)。巨大的巨大?你说的XML和内存都很庞大。即使是100MB的文件也不是什么大问题。 DOM可以处理它。您需要每天解析多次。如果一个操作在几分钟内完成,那么将数据保留在内存中接下来的几个小时似乎并不明智。在这种情况下,你失去了DOM的好处。但是如果一个操作本身需要一个小时,那么你就是保留预处理信息的权利。

        正如我所说,你没有提供足够的统计数据。获取有关数据大小,内存大小,DOM内加载时间,处理时间的统计数据,确切地说,您每天需要多少次?你的机器人在此期间做了什么?闲置或分析其他此类文件?

        获取这些统计数据。无论是在这里发布还是自己分析它们都会得出结论。