Groovy XmlSlurper与XmlParser


78

我在这个主题上搜索了一段时间,并找到了一些结果,我将在发布结尾处提及。有人可以帮我准确地回答下面列出的三个问题吗?

  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在分析文档后存储中间结果。但另一方面,

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

处理已解析的信息时,真正的根本区别变得明显。那就是在直接就地数据处理和流场景中进行处理时。

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

groovy文档(XmlParserXmlSlurper)和groovy的站点(在这里这里)对它们的解释很好,但是在解释上述问题方面做得并不出色。

Answers:


105

XmlSlurper和XmlParser之间的最大区别在于,解析器将创建类似于DOM的内容,而Slurper尝试仅在确实需要时才创建结构,并因此使用延迟评估的路径。对于用户而言,两者看起来极为平等。区别在于,解析器结构仅被评估一次,可以根据需要评估细分路径。按需可以在此处理解为“内存效率更高,但速度较慢”。最终,这取决于您执行的路径/请求数。例如,如果您只想知道XML特定部分中的属性值然后完成操作,则XmlParser仍将处理所有内容并在准DOM上执行查询。这样,将创建许多对象,内存和CPU开销。XmlSlurper将不会创建对象,从而节省内存和CPU。

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

因此,对于问题(1)(用例)的答案是,如果必须处理整个XML,则使用解析器;如果仅处理XML的一部分,则使用Sapper。API和语法在其中并没有真正发挥作用。Groovy的人们试图使这两个用户体验非常相似。另外,如果要对XML进行增量更改,则与解析器相比,您更喜欢使用解析器。

上面的介绍也解释了什么是更高的内存效率,问题(2)。最好的办法是,除非您始终阅读,否则解析器可能会,但是我没有关于两者之间的差异有多少的实际数字。

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

因此,我想说(3a)读取几乎所有节点本身并没有多大区别,因为那样的话,请求是更为确定的因素。但是在情况(3b)中,我想说的是,如果您只需要读取几个节点,则更快,因为它不必在内存中创建完整的结构,而这本身已经浪费了时间和内存。

至于(3c)...如今,这两者都可以更新/转换XML,实际上,更快的速度与您必须更改xml的多少部分有更多联系。如果有很多部分,我会说解析器,如果没有,那么也许是吃喝玩乐的人。但是,例如,如果您想使用草拟器将属性值从“ Fred”更改为“ John”,而以后再使用相同的草草查询该“ John”,则将无法使用。


敬请谅解。这解决了我的问题,当尝试在slurper中“空”时递归删除节点时,这当然是行不通的。
Sandos

3

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

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

希望能帮助到你

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.