kda*_*bir 75 xml groovy xmlslurper xml-parsing
我在这个主题上搜索了一段时间,并发现了一些结果,我在帖子的末尾提到了.对于下面列出的案例,有人可以帮我准确回答这三个问题吗?
对于哪些使用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在解析文档后存储中间结果.但另一方面,
处理XML文档后,XMLSlurper不存储内部结果.
在处理解析的信息时,真正的基本差异变得明显.这是在流式场景中使用直接就地数据处理和处理进行处理的时候.
http://groovy.dzone.com/news/john-wilson-groovy-and-xml
groovy doc(XmlParser,XmlSlurper)和groovy的网站很好地解释了它们(这里和这里),但在解释上述问题方面做得并不好.
bla*_*rag 102
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",它将无法工作.
我会给你一个清晰的答案:
*XML 解析器比 XML Slurper 更快。
*XML Slurper 比 XML Parser 消耗更少的内存。
*XML 解析器可以同时解析和更新 XML。
*对于 XML Slurper,您需要在每次更新后标记构建 XML。
*当你想使用路径表达式时,XML Slurper 会比解析器更好。
*用于读取几乎所有节点 XML 解析器会很好
希望能帮助到你