Groovy XmlSlurper 与 XmlParser

Posted

技术标签:

【中文标题】Groovy XmlSlurper 与 XmlParser【英文标题】:Groovy XmlSlurper vs XmlParser 【发布时间】:2011-11-25 08:38:25 【问题描述】:

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

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

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

    哪个处理xml更快?

案例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 文档(XmlParser、XmlSlurper)和 groovy 网站很好地解释了它们(here 和 here),但在解释上述问题方面做得不好。

【问题讨论】:

【参考方案1】:

XmlSlurper 和 XmlParser 的最大区别在于 Parser 将创建类似于 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”,它将不起作用。

【讨论】:

关于 slurper 更新的精彩解释,谢谢。这解决了我在 slurper 中“空”时尝试递归删除节点时的问题,这当然行不通。【参考方案2】:

我会给你一个清晰的答案:

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

希望对你有帮助

【讨论】:

以上是关于Groovy XmlSlurper 与 XmlParser的主要内容,如果未能解决你的问题,请参考以下文章

使用 Groovy 和 XMLSulrper 数据复制目录

nifi FlowFile 尚未关闭(Groovy 脚本)警告

xmlslurper 按子值从 xml 中删除节点

crawler 使用jQuery风格实现

Groovy06_Groovy方法扩展与脚本调用

Groovy06_Groovy方法扩展与脚本调用