83

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

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

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

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

案例一。当我必须读取 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)和 groovy 的网站很好地解释了它们(这里这里),但在解释上述问题方面做得不好。

4

2 回答 2

109

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

两者都可以对文档进行转换,但是 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”,则它将不起作用。

于 2011-10-01T16:46:47.487 回答
6

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

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

希望能帮助到你

于 2018-08-02T05:32:35.617 回答