我在这个主题上搜索了一段时间,也找到了一些结果,我在文章末尾提到了这些结果。谁能帮我准确回答下面列出的这三个问题?
对于哪些用例,使用 XmlSluper 比 XmlParser 更有意义,反之亦然(从 API/语法的易用性角度来看)?
哪个内存效率更高? (看起来像 Slurper)
哪个处理 xml 的速度更快?
案例一。当我必须读取 xml 中的几乎所有节点时?
案例b。当我只需要读取几个节点时(比如使用 gpath 表达式)?
案例c。什么时候必须更新/转换 xml?
前提是 xml 文件不是普通文件(具有 xml 的深度和大小级别)。
资源:
http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html状态:
Difference between XMLParser and XMLSlurper:
There are similarities between XMLParser and XMLSlurper when used for simple reading but when we use them for advanced reading and when processing XML documents in other formats there are differences between two.
XMLParser stores intermediate results after parsing documents. But on the other hand,
XMLSlurper does not stores internal results after processing XML documents.
The real, fundamental differences become apparent when processing the parsed information. That is when processing with direct in-place data manipulation and processing in a streaming scenario.
http://groovy.dzone.com/news/john-wilson-groovy-and-xml
groovy 文档(XmlParser、XmlSlurper)和 groovy 网站对它们进行了很好的解释(here 和 here),但在解释上述问题方面做得不是很好。
最佳答案
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) 中,如果你只需要读取几个节点,slurper 会更快,因为它不必在内存中创建一个完整的结构,这本身就已经花费了时间和内存。
至于 (3c)...现在两者都可以更新/转换 XML。哪个更快实际上更多地与您必须更改的 xml 的多少部分相关联。如果有很多部分我会说是解析器,如果不是,那么可能是 slurper。但是,例如,如果您想使用 slurper 将属性值从“Fred”更改为“John”,只是为了稍后使用相同的 slurper 查询此“John”,则它不会起作用。
关于xml - Groovy XmlSlurper 与 XmlParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558019/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi
这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::
我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att
我正在尝试通过POST将XML内容发送到一个简单的Rails项目中的Controller(“解析”)方法(“索引”)。它不是RESTful,因为我的模型名称不同,比如“汽车”。我在有效的功能测试中有以下内容:deftest_index...data_file_path=File.dirname(__FILE__)+'/../../app/views/layouts/index.xml.erb'message=ERB.new(File.read(data_file_path))xml_result=message.result(binding)doc=REXML::Document.ne
我有这样的代码:@doc=Nokogiri::HTML(open(url)@doc.xpath(query).eachdo|html|putshtml#howgetcontentofanodeend我如何获取节点的内容而不是像这样: 最佳答案 这是READMEfile中的概要示例为Nokogiri展示了一种使用CSS、XPath或混合的方法:require'nokogiri'require'open-uri'#GetaNokogiri::HTML:Documentforthepagewe’reinterestedin...doc=N
恐怕我没有太多通过网络服务器发布文档(例如XML)的经验,所以如果我对HTTP的理解不足,我深表歉意。我在127.0.0.1上的ruby应用程序中设置了一个基本的MongrelWeb服务器端口2000.(服务器)。我在同一台计算机上运行一个单独的Ruby应用程序。(客户)。我需要客户端向服务器发送XML文档。我曾尝试使用Net::HTTP来执行此操作,但我找不到一个明确的示例来告诉我应该做什么。我试过了,但遇到了错误。我已将请求分解,使其尽可能基本:http=Net::HTTP.new("127.0.0.1",2000)http.post('file','query=foo')#x
我有一些XML文档,我想从Sinatra服务器获取这些文档。我做了一些搜索,但找不到任何具体的东西。我确实找到了构建器gem,但我不想从头开始构建文档。我试着做这样的事情get'/'xml='Myname90'bodyxmlend但这会在它周围添加HTML标签。这可能是我所缺少的非常基本的东西。你能给我指出正确的方向吗? 最佳答案 这对于Sinatra来说非常简单:get'/'docontent_type'text/xml'"Luis99"end在获取“/”时,响应将是XML"Luis99"使用正确的content_type。
我已经看到了几件事,但到目前为止似乎没有任何效果。我正在使用nokogirionrails3ruby1.9.2通过url解析xml。xml的片段如下所示:我正在尝试解析它以获取与NewsLineText关联的文本r=node.at_xpath('.//newslinetext')ifnode.at_xpath('.//newslinetext')s=node.at_xpath('.//newslinetext').textifnode.at_xpath('.//newslinetext')t=node.at_xpath('.//newslinetext').contentifnod