Java 为什么sax解析比dom解析快?stax是如何工作的?
有点相关: 是的,这个问题相当冗长——对不起。我尽我所能地保持它的密度。我大胆地提出了这些问题,以便在阅读全文之前更容易窥视 为什么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%),但这并不是我(等)所猜测的幅度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树。我正在编写一个供
感谢DOM解析需要将整个文档加载到内存中,然后遍历一棵树以找到所需的信息
SAX只需要执行基本IO所需的内存,并且可以在读取文档时提取所需的信息。因为SAX是面向流的,所以您甚至可以处理仍由另一个进程编写的文件。SAX更快,因为DOM解析器通常使用SAX解析器在内部解析文档,然后再额外创建和操作对象来表示每个节点,即使应用程序不关心它们 直接使用SAX的应用程序可能比DOM“解析器”更有效地利用信息集 StAX是一种很好的媒介,在这种媒介中,应用程序可以获得比SAX的事件驱动方法更方便的API,但不会因为创建完整的DOM而效率低下。SAX比DOM快(通常在读取大型XML文档时感觉到),因为SAX以事件序列的形式提供信息(通常通过处理程序访问)DOM创建节点并管理节点创建结构,直到完全创建DOM树(如XML文档中所示) 对于相对较小的文件,您不会感觉到效果(除了DOM可能会进行额外的处理以创建节点元素和/或节点列表)
我无法对StAX进行评论,因为我从未使用过它。假设您只解析文档,不同解析器标准的排名如下: 1。斯塔克斯是最快的
- 事件已向您报告
- 它完成了StAX所做的一切,而且内容是自动实现的(元素名、名称空间、属性等)
- 它执行SAX所做的一切,并将信息显示为节点的实例
- 如果需要维护所有XML,DOM是标准表示形式。它与XSLT转换、XPath()和模式验证()API干净地集成。然而,若性能是关键,那个么使用StAX构建自己的树结构的速度可能比DOM解析器构建DOM的速度要快