Groovy XmlSlurper与XmlParser

Groovy XmlSlurper与XmlParser,xml,groovy,xml-parsing,xmlslurper,Xml,Groovy,Xml Parsing,Xmlslurper,我在这个主题上搜索了一会儿,也找到了一些结果,我在文章的最后提到了这些结果。有人能帮我准确地回答下面列出的三个问题吗 对于哪些用例,使用XMLSluber比XmlParser更有意义,反之亦然(从API/语法易用性的角度来看) 哪一个内存效率更高?(看起来像Slurper) 哪一个处理xml更快 案例a。当我必须读取xml中几乎所有的节点时 案例b。当我必须只读取几个节点时(比如使用gpath表达式) 案例c。何时必须更新/转换xml 前提是xml文档不是琐碎的文档(具有xml的深度和大小) 资

我在这个主题上搜索了一会儿,也找到了一些结果,我在文章的最后提到了这些结果。有人能帮我准确地回答下面列出的三个问题吗

  • 对于哪些用例,使用XMLSluber比XmlParser更有意义,反之亦然(从API/语法易用性的角度来看)

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

  • 哪一个处理xml更快

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

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

    案例c。何时必须更新/转换xml

    前提是xml文档不是琐碎的文档(具有xml的深度和大小)

    资源

    国家:

    XMLParser和XMLSlurper之间的区别:

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

    XMLParser在解析文档后存储中间结果。但关于 另一方面,

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

    在处理数据时,真正的、根本性的差异变得明显 解析信息。即在处理直接就地数据时 流式场景中的操作和处理


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

    XmlSlurper和XmlParser之间的最大区别在于解析器将创建类似于DOM的内容,而Slurper仅在真正需要时尝试创建结构,因此使用路径,这是懒惰的评估。对于用户来说,这两者看起来是极其平等的。不同之处在于解析器结构只评估一次,而slurper路径可以根据需要进行评估。按需可理解为“内存效率更高,但速度较慢”。最终,这取决于您执行了多少路径/请求。例如,如果您只想知道XML的某个部分中某个属性的值,然后对其进行处理,XmlParser仍然会处理所有内容并在准DOM上执行查询。在这种情况下,将创建大量对象,内存和CPU都将消耗。XmlSlurper不会创建对象,从而节省内存和CPU。如果您仍然需要文档的所有部分,slurper将失去优势,因为它将创建至少与解析器一样多的对象

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

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

    上面的介绍也解释了什么是内存效率更高的问题(2)。slurper是,除非你阅读了所有内容,否则解析器可能会,但我没有关于差异有多大的实际数字

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

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


    至于(3c)。。。现在,两者都可以更新/转换XML,速度更快,实际上与您必须更改XML的多少部分联系更紧密。如果很多部分我会说是解析器,如果不是,那么可能是slurper。但是,例如,如果您想使用slurper将属性值从“Fred”更改为“John”,只是为了稍后使用相同的slurper查询此“John”,它将不起作用。

    我将给您一个清晰的答案:

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


    希望这有助于

    关于slurper更新的精彩解释,谢谢。这解决了我在slurper中“空”时尝试递归删除节点时遇到的问题,当然这是行不通的。