我在这个话题上搜索了一段时间,也发现了一些结果,我在文章末尾提到了这一点。有人能帮我准确地回答下面列出的三个问题吗?
案例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 (XmlParser,XmlSlurper)和groovy的站点很好地解释了它们(这里和这里),但在解释上述问题方面做得不太好。
发布于 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“,那么它将无法工作。
发布于 2018-08-02 05:32:35
我会给你一个清晰的答案:
希望它能帮上忙
https://stackoverflow.com/questions/7558019
复制相似问题