Groovy XmlSlurper与XmlParser

时间:2011-09-26 16:13:17

标签: xml groovy xml-parsing xmlslurper

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

  1. 使用XmlSluper的用例比XmlParser更有意义,反之亦然(从易用性API /语法的角度来看)?

  2. 哪一个内存效率更高? (看起来像Slurper)

  3. 哪一个更快地处理xml?

  4. 案例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 doc(XmlParserXmlSlurper)和groovy的网站很好地解释了它们(herehere)但是在解释上述内容方面做得不好问题

2 个答案:

答案 0 :(得分:98)

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

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

所以问题(1)的答案,即用例,如果你必须处理整个XML,那么就使用解析器,如果只是部分的话,则使用slurper。 API和语法在这方面并没有起到太大作用。 Groovy的人试图让这两者在用户体验上非常相似。如果你想对XML进行增量更改,你也希望解析器胜过slurper。

上面的介绍也解释了什么是更有效的内存,问题(2)。除非你全部读完,否则诽谤者会解析,但是我没有关于差异有多大的实际数字。

问题(3)也可以通过介绍回答。如果您有多个延迟评估路径,则必须再次进行评估,然后这可能比您在解析器中导航现有图形时要慢。因此,解析器可以更快,具体取决于您的使用情况。

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

至于(3c)......现在两者都可以更新/转换XML,这实际上更快地与你必须改变的xml部分相关联。如果很多部分我会说解析器,如果不是,那么也许是诽谤者。但是,如果您想要使用slurper将属性值从“Fred”更改为“John”,以便稍后使用相同的slurper查询此“John”,则无法使用。

答案 1 :(得分:1)

我会给你一个简短的答案:

* XML解析器比XML Slurper更快。
* XML Slurper比XML Parser占用的内存更少。
* XML解析器可以同时解析和更新XML。
*对于XML Slurper,您需要在每次更新后标记XML。
*当您要使用路径表达式时,XML Slurper比解析器要好。
*用于读取几乎所有节点的XML解析器就可以了

希望有帮助