与:来自java的libxml2有关
是的,这个问题很长-很抱歉。我尽可能地保持着浓密。在阅读整篇文章之前,我用粗体回答了这些问题,以便更容易地看一眼。
为什么sax解析要比dom解析快?我唯一能想到的是,您可能忽略了大多数传入数据,因此不会浪费时间来处理您不关心的部分xml。IOW -解析w/ SAX后,无法重新创建原始输入。如果您编写了SAX解析器,以便将每个节点都计算在内(因此可以重新创建原始节点),那么它将不会比DOM更快吗?
我之所以问这个问题,是因为我试图更快地解析xml文档。解析后,我需要访问整个xml树。我正在为第三方服务编写一个要插入的平台,所以我无法预测xml文档的哪些部分是需要的,哪些部分不需要,我甚至不知道传入文档的结构。这就是为什么我不能使用jaxb或sax。内存占用对我来说不是一个问题,因为xml文档很小,每次只需要一个内存。解析这个相对较小的xml文档所花费的时间让我心灰意冷。我以前没有使用过stax,但也许我需要进一步研究,因为它可能是中间地带?如果我正确理解,stax保留原始的结构,并按需要处理所需的部分?,这样的话,最初的解析时间可能会很快,但是每次我要求它遍历它尚未遍历的部分树时,就会发生这种情况吗?
如果你提供的链接回答了大部分问题,我会接受你的回答(如果你已经在其他地方回答了我的问题,你就不用直接回答)。
更新:我用sax重写了它,它在avg2.1ms上解析文档。这是一个提高(16% )比多姆采取的2.5ms,但这不是我(等人)会猜到的的幅度。
谢谢
发布于 2010-09-29 20:03:03
假设您只解析文档,则不同解析器标准的排序如下:
1. StAX是最快的
2. SAX是下一个
3. DOM是最后一个
您的用例
发布于 2010-09-29 19:42:02
DOM解析要求您将整个文档加载到内存中,然后遍历一棵树来查找所需的信息。
SAX只需要执行基本IO所需的内存,并且可以在读取文档时提取所需的信息。因为SAX是面向流的,所以您甚至可以处理仍然由另一个进程编写的文件。
发布于 2010-09-29 19:42:47
SAX更快,因为DOM解析器通常使用SAX解析器在内部解析文档,然后执行创建和操作对象以表示每个节点的额外工作,即使应用程序不关心它们。
直接使用SAX的应用程序可能比DOM“解析器”更有效地利用信息集。
StAX是一个很好的媒介,应用程序可以获得比SAX事件驱动的方法更方便的API,但它不会因为创建完整的DOM而效率低下。
https://stackoverflow.com/questions/3825206
复制相似问题