Java 为什么sax解析比dom解析快?stax是如何工作的?

Java 为什么sax解析比dom解析快?stax是如何工作的?,java,xml,dom,sax,stax,Java,Xml,Dom,Sax,Stax,有点相关: 是的,这个问题相当冗长——对不起。我尽我所能地保持它的密度。我大胆地提出了这些问题,以便在阅读全文之前更容易窥视 为什么sax解析比dom解析快?我唯一能想到的是,w/sax可能忽略了大部分传入数据,因此不会浪费时间处理不关心的xml部分。IOW-解析w/SAX后,无法重新创建原始输入如果编写SAX解析器,使其能够解释每个xml节点(从而可以重新创建原始节点),那么它不会比DOM快多少? 我问这个问题的原因是我试图更快地解析xml文档。我需要在解析后访问整个xml树。我正在编写一个供

有点相关:

是的,这个问题相当冗长——对不起。我尽我所能地保持它的密度。我大胆地提出了这些问题,以便在阅读全文之前更容易窥视

为什么sax解析比dom解析快?我唯一能想到的是,w/sax可能忽略了大部分传入数据,因此不会浪费时间处理不关心的xml部分。IOW-解析w/SAX后,无法重新创建原始输入如果编写SAX解析器,使其能够解释每个xml节点(从而可以重新创建原始节点),那么它不会比DOM快多少?

我问这个问题的原因是我试图更快地解析xml文档。我需要在解析后访问整个xml树。我正在编写一个供第三方服务插入的平台,因此我无法预测xml文档的哪些部分需要,哪些部分不需要。我甚至不知道传入文档的结构。这就是为什么我不能使用jaxb或sax。内存占用对我来说不是问题,因为xml文档很小,一次只需要1个内存。正是解析这个相对较小的xml文档所花费的时间让我感到痛苦。我以前没有使用过stax,但也许我需要进一步调查,因为它可能是一个折衷方案如果我理解正确,stax将保留原始xml结构,并按需处理我请求的部分?这样,原始解析时间可能会很快,但每次我请求它遍历它尚未遍历的树的一部分时,处理就发生了

如果你提供了一个可以回答大多数问题的链接,我将接受你的回答(如果我的问题已经在别处得到了回答,你不必直接回答)

更新:我用sax重写了它,它以平均2.1毫秒的速度解析文档。这比dom使用的2.5毫秒有了改进(快了16%),但这并不是我(等)所猜测的幅度


感谢

DOM解析需要将整个文档加载到内存中,然后遍历一棵树以找到所需的信息


SAX只需要执行基本IO所需的内存,并且可以在读取文档时提取所需的信息。因为SAX是面向流的,所以您甚至可以处理仍由另一个进程编写的文件。

SAX更快,因为DOM解析器通常使用SAX解析器在内部解析文档,然后再额外创建和操作对象来表示每个节点,即使应用程序不关心它们

直接使用SAX的应用程序可能比DOM“解析器”更有效地利用信息集

StAX是一种很好的媒介,在这种媒介中,应用程序可以获得比SAX的事件驱动方法更方便的API,但不会因为创建完整的DOM而效率低下。

SAX比DOM快(通常在读取大型XML文档时感觉到),因为SAX以事件序列的形式提供信息(通常通过处理程序访问)DOM创建节点并管理节点创建结构,直到完全创建DOM树(如XML文档中所示)

对于相对较小的文件,您不会感觉到效果(除了DOM可能会进行额外的处理以创建节点元素和/或节点列表)


我无法对StAX进行评论,因为我从未使用过它。

假设您只解析文档,不同解析器标准的排名如下:

1。斯塔克斯是最快的

  • 事件已向您报告
2。SAX是下一个

  • 它完成了StAX所做的一切,而且内容是自动实现的(元素名、名称空间、属性等)
3。DOM是最后一个

  • 它执行SAX所做的一切,并将信息显示为节点的实例
您的用例

  • 如果需要维护所有XML,DOM是标准表示形式。它与XSLT转换、XPath()和模式验证()API干净地集成。然而,若性能是关键,那个么使用StAX构建自己的树结构的速度可能比DOM解析器构建DOM的速度要快

是的,我理解。我的问题是“为什么sax解析更快?”而不是“sax和dom之间有什么区别?”@Stargazer712-mikerobi的回答没有回答我的问题。我怀疑他/她是否读过这个问题。这是对任何dom/sax问题的机械回答。如果有人愿意花时间提供一个深思熟虑的答案,我会持开放态度。@andersonbd1,我准备好了你的问题,很抱歉你没有理解我的答案。对我来说,很明显,一个需要更多内存的进程,在它被完全解析之前不会让你访问数据,这比一个需要很少内存的进程要慢,这个进程允许你以几乎可以读取的速度访问数据。@andersonbd1,在阅读您的问题时,我觉得您确实不理解SAX和DOM之间的区别,这是您不知道问题答案的一个因素。有鉴于此,米克罗比的回答是合理的。你可能确实理解其中的区别,但你的问题并没有说明这一点。声称他没有读过这个问题或给出了一个轻率的回答是没有必要的。@mikerobi-我为声称你没有读过这个问题而道歉。我有点防御性,因为我被指控没有“开放的思想”。但这场戏剧已经足够了——在我看来,需要2.5毫秒的内存似乎并不重要。我在计算机中做了很多内存密集型操作