2011-09-26 91 views
65

我在这个主题上搜索了一段时间,发现了一些结果,我在帖子末尾提到了这些结果。有人可以帮我准确地回答下面列出的三个问题吗?Groovy XmlSlurper vs XmlParser

  1. 对于该使用情况使用XmlSluper更有意义比XmlParser的,反之亦然(视图中易于使用API​​ /语法中的点)?

  2. 哪一个更有记忆效率? (看起来像Slurper)

  3. 哪一个更快地处理xml?案例a。

案例a。当我必须读取xml中的几乎所有节点?案例b。当我必须只读几个节点(如使用gpath表达式)?

案例c。当我必须更新/转换XML?

提供的xml文档不是微不足道的(具有深度和尺寸的xml级别)。

资源

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)和常规的网站解释说得好(herehere),但在解释上述问题并没有做大量的工作。

回答

90

XmlSlurper和XmlParser最大的区别在于Parser会创建类似于DOM的东西,而Slurper只是在真正需要的时候才会尝试创建结构,并因此使用延迟评估的路径。对于用户来说,两者看起来可以非常平等不同之处在于解析器结构仅评估一次,可以根据需要评估更新器路径。在需求可以被认为是“更高的内存效率,但更慢”在这里。最终取决于你做了多少路径/请求。例如,如果您只想知道XML特定部分中某个属性的值,然后完成它,则XmlParser仍会处理所有内容并在准DOM上执行您的查询。因为会创建很多对象,内存和CPU花费。 XmlSlurper不会创建对象,从而节省内存和CPU。如果您仍然需要文档的所有部分,则slurper将失去优势,因为它将创建至少与解析器一样多的对象。

两者都可以对文档进行转换,但是slurper认为它是一个常量,因此您必须首先编写更改并创建新的slurper来读取新的xml。解析器支持查看更改远。

因此,问题(1)的答案是用例,如果必须处理整个XML,则使用解析器。 API和语法在这方面并没有真正起到很大的作用。 Groovy人试图让这两个用户体验非常相似。如果您想对XML进行增量更改,您也会更喜欢解析器而不是XML。

上面的介绍也解释了什么是更高的内存效率,问题(2)。无论如何,除非你读完所有的解析器,否则解析器可能,但是我没有实际的数字来说明那时差异有多大。

也可以通过介绍回答问题(3)。如果您有多个延迟评估路径,则必须再次进行评估,然后这可能会比您在解析器中导航现有图形时慢。所以解析器可以更快,这取决于您的使用情况。所以我会说(3a)读取几乎所有的节点本身并没有太大区别,因为这样的请求才是更重要的决定因素。但是在(3b)的情况下,如果你只需要读取几个节点,我会说slurper速度更快,因为它不需要在内存中创建一个完整的结构,这本身已经花费了时间和内存。 (3c)...现在,这两天都可以更新/转换XML,而更快的XML实际上更多地与您必须更改的xml的多少部分相关联。如果很多部分我会说解析器,如果不是的话,那么也许就是slurper。但是,如果您想要使用slurper将属性值从“Fred”更改为“John”,则稍后使用相同的slurper查询此“John”时,它将不起作用。

+0

关于slurper更新的真棒解释,谢谢。这解决了我的问题,当试图删除节点递归时,当在一个slurper“空”,这当然是行不通的。 – sandos