Groovy XmlSlurper vs XmlParser

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

  1. 对于哪些使用XmlSluper的用例比XmlParser更有意义,反之亦然(从API / Syntax的易用性来看)?

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

  3. 哪一个处理xml更快?

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

案例b。 当我必须只读几个节点(如使用gpathexpression式)?

案例c。 当我不得不更新/转换的XML?

前提是xml文档不是微不足道的(具有深度和大小的xml级别)。

资源

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html指出:

XMLParser和XMLSlurper的区别:

XMLParser和XMLSlurper在用于简单阅读时有相似之处,但当我们使用它们进行高级阅读和处理其他格式的XML文档时,两者之间存在差异。

parsing文档后,XMLParser存储中间结果。 但另一方面,

XMLSlurper在处理XML文档后不存储内部结果。

处理parsing的信息时,真正的根本区别变得明显。 那就是在stream媒体场景中直接就地处理数据并进行处理的时候。

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

groovy doc( XmlParser , XmlSlurper )和groovy的站点解释了他们( 这里和这里 ),但在解释上述问题方面做得不是很好。

XmlSlurper和XmlParser最大的区别在于,Parser会创build类似于DOM的东西,而Slurper只是在真正需要的时候才会创build结构,因此使用的是path,而这些都是被懒惰地评估过的。 对于用户来说,两者可以看起来非常平等 不同之处在于parsing器结构仅被评估一次,可以根据需要评估静默path。 在需求可以被看作是“更高的内存效率,但更慢”在这里。 最终取决于你做了多lesspath/请求。 例如,如果您只想知道XML中某个特定部分的某个属性的值,然后用它来完成,那么XmlParser仍然会处理所有这些并在准DOM上执行您的查询。 在这个过程中,会创build很多对象,内存和CPU。 XmlSlurper不会创build对象,从而节省内存和CPU。 如果你需要文档的所有部分,slurper就会失去这个优点,因为它将创build至less和parsing器一样多的对象。

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

所以,问题(1)的答案(用例)将会是,如果您必须处理整个XML,则使用parsing器,而如果仅处理其中的一部分则使用parsing器。 API和语法在这方面确实起不到什么作用。 Groovy人试图使这两者在用户体验上非常相似。 如果您想对XML进行增量更改,您也会更喜欢使用slurper的parsing器。

上面的介绍也解释了什么是更高效的内存,问题(2)。 除非你读了,否则parsing器可能会parsing器,但是我没有实际的数字来说明差别有多大。

另外问题(3)可以通过介绍来回答。 如果您有多个延迟评估path,则必须再次进行评估,然后这可能会比在parsing器中导航现有graphics时慢。 所以parsing器可以更快,这取决于你的使用情况。

所以我想说(3a)读取几乎所有的节点本身没有什么区别,因为这样的请求是更多的决定因素。 但是在(3b)的情况下,如果你只需要读取几个节点,我会说slurper更快,因为它不需要在内存中创build一个完整的结构,这本身已经花费了时间和内存。

至于(3c)…现在这两天都可以更新/转换的XML,这是更快的实际上是更多的链接到多less部分的XML你必须改变。 如果很多部分我会说parsing器,如果没有,那么也许是slurper。 但是,如果你想要例如使用slurper将属性值从“Fred”更改为“John”,稍后使用相同的slurper查询这个“John”,则它将不起作用。