首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy XmlSlurper与XmlParser

Groovy XmlSlurper与XmlParser
EN

Stack Overflow用户
提问于 2011-09-26 16:13:17
回答 2查看 28.4K关注 0票数 85

我在这个话题上搜索了一段时间,也发现了一些结果,我在文章末尾提到了这一点。有人能帮我准确地回答下面列出的三个问题吗?

  1. 对于哪些用例使用XmlSluper比使用XmlParser更有意义,反之亦然(从使用API/语法的易用性角度看)?
  2. 哪一个内存效率更高?(看起来像是Slurper)
  3. 哪个处理xml的速度更快?

案例a.当我必须读取xml中几乎所有的节点时?

案例b。当我只需要读取几个节点时(比如使用gpath表达式)?

案例c.当我必须更新/转换xml时?

只要xml文档不是简单的文档(具有xml的深度和大小)。

Resources

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html声明:

XMLParser和XMLSlurper的区别: XMLParser和XMLSlurper在简单阅读时有相似之处,但当我们将它们用于高级阅读和以其他格式处理XML文档时,两者之间存在差异。 XMLParser在解析文档后存储中间结果。但另一方面, XMLSlurper处理完XML文档后不存储内部结果。 在处理所分析的信息时,真正的、根本性的差异变得明显。也就是说,在流场景中使用直接就地数据处理和处理时。

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

groovy (XmlParserXmlSlurper)和groovy的站点很好地解释了它们(这里这里),但在解释上述问题方面做得不太好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-01 16:46:47

XmlSlurper和XmlParser的最大区别在于,解析器将创建类似于DOM的东西,而Slurper只在真正需要的情况下尝试创建结构,从而使用路径,这些路径是延迟计算的。对于用户来说,两者看起来都是极其平等的。不同之处在于,解析器结构只计算一次,可以根据需要计算修整路径。在这里,随需应变可以理解为“内存效率更高,但速度更慢”。最终,这取决于您执行了多少路径/请求。例如,如果您只想知道某个属性在XML的某个部分中的值,然后使用它,XmlParser仍然会处理所有的内容并在准DOM上执行您的查询。在这个过程中,大量的对象将被创建,内存和CPU都会花费。XmlSlurper不会创建对象,从而节省内存和CPU。如果您无论如何都需要文档的所有部分,那么slurper就会失去优势,因为它将创建至少与解析器一样多的对象。

这两种方法都可以对文档进行转换,但是slurper假设它是一个常量,因此您必须首先将更改写出来并创建一个新的slurper来读取新的xml。解析器支持立即查看更改。

因此,问题(1)的答案是用例,如果您必须处理整个XML,则使用解析器,如果只处理其中的部分,则使用这个解析器。API和语法在这方面并没有发挥多大作用。Groovy的人试图使这两者在用户体验上非常相似。此外,如果您希望对XML进行增量更改,那么您更希望使用解析器而不是slurper。

上面的介绍也解释了什么是更有效的内存,问题(2)。问题是,除非你至少阅读了所有的内容,否则解析器可能会出现,但我没有实际的数字说明两者之间的差异有多大。

问题(3)也可以通过介绍来回答。如果您有多个延迟计算的路径,那么您必须再次评估,这可能比您只在解析器中导航一个现有的图形要慢。因此,解析器可以更快,这取决于您的使用。

因此,我想说(3a)读取几乎所有节点本身并没有多大的区别,因为请求是更多的决定性因素。但是如果(3b),我想说,如果你只需要读几个节点的话,睡眠器会更快,因为它不需要在内存中创建一个完整的结构,这本身就已经花费了时间和内存。

至于(3c)...these,两者都可以更新/转换XML。更快的部分实际上更多地链接到您需要更改的xml的多少部分。如果有很多部分,我会说解析器,如果不是,那么可能是slurper。但是,如果您想要将属性值从"Fred“更改为"John”,然后使用相同的slurper查询这个"John“,那么它将无法工作。

票数 111
EN

Stack Overflow用户

发布于 2018-08-02 05:32:35

我会给你一个清晰的答案:

  • XML比更快。
  • XML比XML消耗更少的内存。
  • XML解析器可以同时解析和更新XML。
  • 对于XMLs,您需要在每次更新之后对XML进行MarkupBuild。
  • 当您想使用路径表达式时,XML将比解析器更好。
  • 对于读取几乎所有节点,XML都可以。

希望它能帮上忙

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7558019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档